From b37433709c40be4166482ed48a6103a40ea3249f Mon Sep 17 00:00:00 2001 From: FIMTooler Date: Mon, 13 Nov 2023 16:35:16 -0500 Subject: [PATCH 01/10] Rebuilt both the Import Flows and Export Flows tables within the End-to-End Attribute Flows Summary section to make them more readable and easy to understand. --- .../ConnectorDocumenter.cs | 914 +++++++++--------- 1 file changed, 465 insertions(+), 449 deletions(-) diff --git a/src/AzureADConnectSyncDocumenter/ConnectorDocumenter.cs b/src/AzureADConnectSyncDocumenter/ConnectorDocumenter.cs index 17d2017..d8bb0d1 100644 --- a/src/AzureADConnectSyncDocumenter/ConnectorDocumenter.cs +++ b/src/AzureADConnectSyncDocumenter/ConnectorDocumenter.cs @@ -1251,85 +1251,46 @@ protected void ProcessConnectorObjectImportAttributeFlowsSummary() protected void CreateConnectorObjectImportAttributeFlowsSummaryDataSets() { Logger.Instance.WriteMethodEntry(); - + //columns and order + //inboundSyncRuleName, inboundSyncRuleScopingConditionString, inboundExpression, inboundFlowType, inboundArrow, metaverseAttribute, metaverseObjectType, outboundArrow, outboundConnectorName, outboundSyncRuleName, outboundSyncRuleScopingConditionString, outboundObjectType, outboundExpression, outboundFlowType, targetAttribute try { - var table = new DataTable("MetaverseAttributes") { Locale = CultureInfo.InvariantCulture }; - - var column1 = new DataColumn("MetaverseAttribute"); - var column2 = new DataColumn("FlowDirection"); + var table = new DataTable("ImportSummary") { Locale = CultureInfo.InvariantCulture }; + var column1 = new DataColumn("inboundSyncRuleName"); + var column2 = new DataColumn("inboundSyncRuleScopingConditionString"); + var column3 = new DataColumn("inboundExpression"); + var column4 = new DataColumn("inboundFlowType"); + var column5 = new DataColumn("inboundArrow"); + var column6 = new DataColumn("metaverseAttribute"); + var column7 = new DataColumn("metaverseObjectType"); + var column8 = new DataColumn("outboundArrow"); + var column9 = new DataColumn("outboundConnectorName"); + var column10 = new DataColumn("outboundSyncRuleName"); + var column11 = new DataColumn("outboundSyncRuleScopingConditionString"); + var column12 = new DataColumn("outboundObjectType"); + var column13 = new DataColumn("outboundExpression"); + var column14 = new DataColumn("outboundFlowType"); + var column15 = new DataColumn("targetAttribute"); table.Columns.Add(column1); table.Columns.Add(column2); - table.PrimaryKey = new[] { column1 }; - - var table2 = new DataTable("InboundSyncRules") { Locale = CultureInfo.InvariantCulture }; - - var column12 = new DataColumn("MetaverseAttribute"); - var column22 = new DataColumn("Source"); - var column32 = new DataColumn("InboundSyncRule"); - var column42 = new DataColumn("InboundSyncRulePrecedence", typeof(int)); - var column52 = new DataColumn("InboundSyncRuleScopingCondition"); - var column62 = new DataColumn("InboundSyncRuleGuid"); - - table2.Columns.Add(column12); - table2.Columns.Add(column22); - table2.Columns.Add(column32); - table2.Columns.Add(column42); - table2.Columns.Add(column52); - table2.Columns.Add(column62); - table2.PrimaryKey = new[] { column12, column32 }; - - var table3 = new DataTable("MetaverseAttributes2") { Locale = CultureInfo.InvariantCulture }; - - var column13 = new DataColumn("MetaverseAttribute"); // needed for cascading - see table 4 comments - var column23 = new DataColumn("InboundSyncRule"); - var column33 = new DataColumn("FlowDirection"); - - table3.Columns.Add(column13); - table3.Columns.Add(column23); - table3.Columns.Add(column33); - table3.PrimaryKey = new[] { column13 }; - - var table4 = new DataTable("MetaverseObjectTypeOutboundFlows") { Locale = CultureInfo.InvariantCulture }; - - var column14 = new DataColumn("MetaverseAttribute"); - var column24 = new DataColumn("InboundSyncRule"); - var column34 = new DataColumn("Source"); - var column44 = new DataColumn("TargetAttribute"); - var column54 = new DataColumn("OutboundSyncRulePrecedence", typeof(int)); - var column64 = new DataColumn("OutboundSyncRule"); - var column74 = new DataColumn("TargetConnector"); - var column84 = new DataColumn("OutboundSyncRuleSyncRuleScopingCondition"); - var column94 = new DataColumn("TargetConnectorGuid"); - var column104 = new DataColumn("OutboundSyncRuleSyncRuleGuid"); - - table4.Columns.Add(column14); - table4.Columns.Add(column24); - table4.Columns.Add(column34); - table4.Columns.Add(column44); - table4.Columns.Add(column54); - table4.Columns.Add(column64); - table4.Columns.Add(column74); - table4.Columns.Add(column84); - table4.Columns.Add(column94); - table4.Columns.Add(column104); - table4.PrimaryKey = new[] { column14, column44, column64, column74 }; // column24 is excluded as we'll insert only one row in the the parent table. + table.Columns.Add(column3); + table.Columns.Add(column4); + table.Columns.Add(column5); + table.Columns.Add(column6); + table.Columns.Add(column7); + table.Columns.Add(column8); + table.Columns.Add(column9); + table.Columns.Add(column10); + table.Columns.Add(column11); + table.Columns.Add(column12); + table.Columns.Add(column13); + table.Columns.Add(column14); + table.Columns.Add(column15); + table.PrimaryKey = new[] { column1, column2, column3, column4, column5, column6, column7, column8, column9, column10, column11, column12, column13, column14, column15 }; this.PilotDataSet = new DataSet("ImportAttributeFlowsSummary") { Locale = CultureInfo.InvariantCulture }; this.PilotDataSet.Tables.Add(table); - this.PilotDataSet.Tables.Add(table2); - this.PilotDataSet.Tables.Add(table3); - this.PilotDataSet.Tables.Add(table4); - - var dataRelation12 = new DataRelation("DataRelation12", new[] { column1 }, new[] { column12 }, false); - var dataRelation23 = new DataRelation("DataRelation23", new[] { column12, column32 }, new[] { column13, column23 }, false); - var dataRelation34 = new DataRelation("DataRelation34", new[] { column13, column23 }, new[] { column14, column24 }, false); - - this.PilotDataSet.Relations.Add(dataRelation12); - this.PilotDataSet.Relations.Add(dataRelation23); - this.PilotDataSet.Relations.Add(dataRelation34); - this.ProductionDataSet = this.PilotDataSet.Clone(); var printTable = this.GetConnectorObjectImportAttributeFlowsSummaryPrintTable(); @@ -1353,67 +1314,53 @@ protected DataTable GetConnectorObjectImportAttributeFlowsSummaryPrintTable() try { var printTable = Documenter.GetPrintTable(); + //columns and order + //inboundSyncRuleName, inboundSyncRuleScopingConditionString, inboundExpression, inboundFlowType, inboundArrow, metaverseAttribute, metaverseObjectType, outboundArrow, outboundConnectorName, outboundSyncRuleName, outboundSyncRuleScopingConditionString, outboundObjectType, outboundExpression, outboundFlowType,targetAttribute - // Table 1 - // Metaverse Attribute - printTable.Rows.Add(new OrderedDictionary { { "TableIndex", 0 }, { "ColumnIndex", 0 }, { "Hidden", false }, { "SortOrder", 0 }, { "BookmarkIndex", -1 }, { "JumpToBookmarkIndex", -1 }, { "ChangeIgnored", false } }.Values.Cast().ToArray()); - - // Flow Direction - printTable.Rows.Add(new OrderedDictionary { { "TableIndex", 0 }, { "ColumnIndex", 1 }, { "Hidden", false }, { "SortOrder", -1 }, { "BookmarkIndex", -1 }, { "JumpToBookmarkIndex", -1 }, { "ChangeIgnored", true } }.Values.Cast().ToArray()); - - // Table 2 - // Source - printTable.Rows.Add(new OrderedDictionary { { "TableIndex", 1 }, { "ColumnIndex", 1 }, { "Hidden", false }, { "SortOrder", -1 }, { "BookmarkIndex", -1 }, { "JumpToBookmarkIndex", -1 }, { "ChangeIgnored", false } }.Values.Cast().ToArray()); + // Inbound Sync Rule Name + printTable.Rows.Add(new OrderedDictionary { { "TableIndex", 0 }, { "ColumnIndex", 0 }, { "Hidden", false }, { "SortOrder", -1 }, { "BookmarkIndex", -1 }, { "JumpToBookmarkIndex", 5 }, { "ChangeIgnored", false } }.Values.Cast().ToArray()); - // Sync Rule - printTable.Rows.Add(new OrderedDictionary { { "TableIndex", 1 }, { "ColumnIndex", 2 }, { "Hidden", false }, { "SortOrder", -1 }, { "BookmarkIndex", -1 }, { "JumpToBookmarkIndex", 5 }, { "ChangeIgnored", false } }.Values.Cast().ToArray()); + // Inbound Sync Rule Scoping Condition String + printTable.Rows.Add(new OrderedDictionary { { "TableIndex", 0 }, { "ColumnIndex", 1 }, { "Hidden", false }, { "SortOrder", -1 }, { "BookmarkIndex", -1 }, { "JumpToBookmarkIndex", -1 }, { "ChangeIgnored", false } }.Values.Cast().ToArray()); - // Precedence - printTable.Rows.Add(new OrderedDictionary { { "TableIndex", 1 }, { "ColumnIndex", 3 }, { "Hidden", true }, { "SortOrder", 0 }, { "BookmarkIndex", -1 }, { "JumpToBookmarkIndex", -1 }, { "ChangeIgnored", false } }.Values.Cast().ToArray()); + // Inbound Expression + printTable.Rows.Add(new OrderedDictionary { { "TableIndex", 0 }, { "ColumnIndex", 2 }, { "Hidden", false }, { "SortOrder", -1 }, { "BookmarkIndex", -1 }, { "JumpToBookmarkIndex", -1 }, { "ChangeIgnored", false } }.Values.Cast().ToArray()); - // Sync Rule Scoping Condition - printTable.Rows.Add(new OrderedDictionary { { "TableIndex", 1 }, { "ColumnIndex", 4 }, { "Hidden", false }, { "SortOrder", -1 }, { "BookmarkIndex", -1 }, { "JumpToBookmarkIndex", -1 }, { "ChangeIgnored", false } }.Values.Cast().ToArray()); + // Inbound Flow Type + printTable.Rows.Add(new OrderedDictionary { { "TableIndex", 0 }, { "ColumnIndex", 3 }, { "Hidden", false }, { "SortOrder", -1 }, { "BookmarkIndex", -1 }, { "JumpToBookmarkIndex", -1 }, { "ChangeIgnored", true } }.Values.Cast().ToArray()); - // Sync Rule Guid - printTable.Rows.Add(new OrderedDictionary { { "TableIndex", 1 }, { "ColumnIndex", 5 }, { "Hidden", true }, { "SortOrder", -1 }, { "BookmarkIndex", -1 }, { "JumpToBookmarkIndex", -1 }, { "ChangeIgnored", true } }.Values.Cast().ToArray()); + // Inbound Arrow + printTable.Rows.Add(new OrderedDictionary { { "TableIndex", 0 }, { "ColumnIndex", 4 }, { "Hidden", false }, { "SortOrder", -1 }, { "BookmarkIndex", -1 }, { "JumpToBookmarkIndex", -1 }, { "ChangeIgnored", true } }.Values.Cast().ToArray()); - // Table 3 // Metaverse Attribute - printTable.Rows.Add(new OrderedDictionary { { "TableIndex", 2 }, { "ColumnIndex", 0 }, { "Hidden", false }, { "SortOrder", 0 }, { "BookmarkIndex", -1 }, { "JumpToBookmarkIndex", -1 }, { "ChangeIgnored", false } }.Values.Cast().ToArray()); + printTable.Rows.Add(new OrderedDictionary { { "TableIndex", 0 }, { "ColumnIndex", 5 }, { "Hidden", false }, { "SortOrder", 0 }, { "BookmarkIndex", -1 }, { "JumpToBookmarkIndex", -1 }, { "ChangeIgnored", false } }.Values.Cast().ToArray()); - // Inbound Sync Rule Name - printTable.Rows.Add(new OrderedDictionary { { "TableIndex", 2 }, { "ColumnIndex", 1 }, { "Hidden", true }, { "SortOrder", -1 }, { "BookmarkIndex", -1 }, { "JumpToBookmarkIndex", -1 }, { "ChangeIgnored", true } }.Values.Cast().ToArray()); + // Metaverse Object Type + printTable.Rows.Add(new OrderedDictionary { { "TableIndex", 0 }, { "ColumnIndex", 6 }, { "Hidden", false }, { "SortOrder", 0 }, { "BookmarkIndex", -1 }, { "JumpToBookmarkIndex", -1 }, { "ChangeIgnored", false } }.Values.Cast().ToArray()); - // Flow Direction - printTable.Rows.Add(new OrderedDictionary { { "TableIndex", 2 }, { "ColumnIndex", 2 }, { "Hidden", false }, { "SortOrder", -1 }, { "BookmarkIndex", -1 }, { "JumpToBookmarkIndex", -1 }, { "ChangeIgnored", true } }.Values.Cast().ToArray()); + // Outbound Arrow + printTable.Rows.Add(new OrderedDictionary { { "TableIndex", 0 }, { "ColumnIndex", 7 }, { "Hidden", false }, { "SortOrder", -1 }, { "BookmarkIndex", -1 }, { "JumpToBookmarkIndex", -1 }, { "ChangeIgnored", true } }.Values.Cast().ToArray()); - // Table 4 - // Inbound Sync Rule Name - printTable.Rows.Add(new OrderedDictionary { { "TableIndex", 3 }, { "ColumnIndex", 1 }, { "Hidden", true }, { "SortOrder", -1 }, { "BookmarkIndex", -1 }, { "JumpToBookmarkIndex", -1 }, { "ChangeIgnored", true } }.Values.Cast().ToArray()); - - // Source - printTable.Rows.Add(new OrderedDictionary { { "TableIndex", 3 }, { "ColumnIndex", 2 }, { "Hidden", false }, { "SortOrder", -1 }, { "BookmarkIndex", -1 }, { "JumpToBookmarkIndex", -1 }, { "ChangeIgnored", false } }.Values.Cast().ToArray()); - - // Target Attribute - printTable.Rows.Add(new OrderedDictionary { { "TableIndex", 3 }, { "ColumnIndex", 3 }, { "Hidden", false }, { "SortOrder", -1 }, { "BookmarkIndex", -1 }, { "JumpToBookmarkIndex", -1 }, { "ChangeIgnored", false } }.Values.Cast().ToArray()); + // Outbound Connector Name + printTable.Rows.Add(new OrderedDictionary { { "TableIndex", 0 }, { "ColumnIndex", 8 }, { "Hidden", false }, { "SortOrder", -1 }, { "BookmarkIndex", -1 }, { "JumpToBookmarkIndex", 8 }, { "ChangeIgnored", false } }.Values.Cast().ToArray()); - // Outbound Sync Rule Precedence - printTable.Rows.Add(new OrderedDictionary { { "TableIndex", 3 }, { "ColumnIndex", 4 }, { "Hidden", true }, { "SortOrder", 0 }, { "BookmarkIndex", -1 }, { "JumpToBookmarkIndex", -1 }, { "ChangeIgnored", false } }.Values.Cast().ToArray()); + // Outbound Sync Rule Name + printTable.Rows.Add(new OrderedDictionary { { "TableIndex", 0 }, { "ColumnIndex", 9 }, { "Hidden", false }, { "SortOrder", -1 }, { "BookmarkIndex", -1 }, { "JumpToBookmarkIndex", 9 }, { "ChangeIgnored", false } }.Values.Cast().ToArray()); - // Outbound Sync Rule - printTable.Rows.Add(new OrderedDictionary { { "TableIndex", 3 }, { "ColumnIndex", 5 }, { "Hidden", false }, { "SortOrder", -1 }, { "BookmarkIndex", -1 }, { "JumpToBookmarkIndex", 9 }, { "ChangeIgnored", false } }.Values.Cast().ToArray()); + // Outbound Sync Rule Scoping Condition String + printTable.Rows.Add(new OrderedDictionary { { "TableIndex", 0 }, { "ColumnIndex", 10 }, { "Hidden", false }, { "SortOrder", -1 }, { "BookmarkIndex", -1 }, { "JumpToBookmarkIndex", -1 }, { "ChangeIgnored", false } }.Values.Cast().ToArray()); - // Target Connector - printTable.Rows.Add(new OrderedDictionary { { "TableIndex", 3 }, { "ColumnIndex", 6 }, { "Hidden", false }, { "SortOrder", -1 }, { "BookmarkIndex", -1 }, { "JumpToBookmarkIndex", 8 }, { "ChangeIgnored", false } }.Values.Cast().ToArray()); + // Outbound Object Type + printTable.Rows.Add(new OrderedDictionary { { "TableIndex", 0 }, { "ColumnIndex", 11 }, { "Hidden", false }, { "SortOrder", -1 }, { "BookmarkIndex", -1 }, { "JumpToBookmarkIndex", -1 }, { "ChangeIgnored", false } }.Values.Cast().ToArray()); - // Outbound Sync Rule Scoping Condition - printTable.Rows.Add(new OrderedDictionary { { "TableIndex", 3 }, { "ColumnIndex", 7 }, { "Hidden", false }, { "SortOrder", -1 }, { "BookmarkIndex", -1 }, { "JumpToBookmarkIndex", -1 }, { "ChangeIgnored", false } }.Values.Cast().ToArray()); + // Outbound Expression + printTable.Rows.Add(new OrderedDictionary { { "TableIndex", 0 }, { "ColumnIndex", 12 }, { "Hidden", false }, { "SortOrder", -1 }, { "BookmarkIndex", -1 }, { "JumpToBookmarkIndex", -1 }, { "ChangeIgnored", false } }.Values.Cast().ToArray()); - // Target Connector Guid - printTable.Rows.Add(new OrderedDictionary { { "TableIndex", 3 }, { "ColumnIndex", 8 }, { "Hidden", true }, { "SortOrder", -1 }, { "BookmarkIndex", -1 }, { "JumpToBookmarkIndex", -1 }, { "ChangeIgnored", true } }.Values.Cast().ToArray()); + // Outbound Flow Type + printTable.Rows.Add(new OrderedDictionary { { "TableIndex", 0 }, { "ColumnIndex", 13 }, { "Hidden", false }, { "SortOrder", -1 }, { "BookmarkIndex", -1 }, { "JumpToBookmarkIndex", -1 }, { "ChangeIgnored", true } }.Values.Cast().ToArray()); - // Outbound Sync Rule Guid - printTable.Rows.Add(new OrderedDictionary { { "TableIndex", 3 }, { "ColumnIndex", 9 }, { "Hidden", true }, { "SortOrder", -1 }, { "BookmarkIndex", -1 }, { "JumpToBookmarkIndex", -1 }, { "ChangeIgnored", true } }.Values.Cast().ToArray()); + // Target Attribute + printTable.Rows.Add(new OrderedDictionary { { "TableIndex", 0 }, { "ColumnIndex", 14 }, { "Hidden", false }, { "SortOrder", -1 }, { "BookmarkIndex", -1 }, { "JumpToBookmarkIndex", -1 }, { "ChangeIgnored", false } }.Values.Cast().ToArray()); printTable.AcceptChanges(); @@ -1431,6 +1378,8 @@ protected DataTable GetConnectorObjectImportAttributeFlowsSummaryPrintTable() /// if set to true, the pilot configuration is loaded. Otherwise, the production configuration is loaded. protected void FillConnectorObjectImportAttributeFlowsSummary(bool pilotConfig) { + //columns and order + //inboundSyncRuleName, inboundSyncRuleScopingConditionString, inboundExpression, inboundFlowType, inboundArrow, metaverseAttribute, metaverseObjectType, outboundArrow, outboundConnectorName, outboundSyncRuleName, outboundSyncRuleScopingConditionString, outboundObjectType, outboundExpression, outboundFlowType, targetAttribute Logger.Instance.WriteMethodEntry("Pilot Config: '{0}'.", pilotConfig); try @@ -1439,9 +1388,6 @@ protected void FillConnectorObjectImportAttributeFlowsSummary(bool pilotConfig) var dataSet = pilotConfig ? this.PilotDataSet : this.ProductionDataSet; var table = dataSet.Tables[0]; - var table2 = dataSet.Tables[1]; - var table3 = dataSet.Tables[2]; - var table4 = dataSet.Tables[3]; var connector = config.XPathSelectElement(Documenter.GetConnectorXmlRootXPath(pilotConfig) + "/ma-data[name ='" + this.ConnectorName + "']"); @@ -1455,84 +1401,132 @@ orderby dest select dest; foreach (var metaverseAttribute in metaverseAttributes.Distinct()) { - Documenter.AddRow(table, new object[] { metaverseAttribute, "←" }); - var inboundSyncRuleXPath = Documenter.GetSynchronizationRuleXmlRootXPath(pilotConfig) + "/synchronizationRule[translate(connector, '" + Documenter.LowercaseLetters + "', '" + Documenter.UppercaseLetters + "') = '" + connectorGuid + "' and direction = 'Inbound' " + Documenter.SyncRuleDisabledCondition + " and sourceObjectType = '" + this.currentDataSourceObjectType + "' and ./attribute-mappings/mapping/dest = '" + metaverseAttribute + "']"; var inboundSyncRules = config.XPathSelectElements(inboundSyncRuleXPath); inboundSyncRules = from syncRule in inboundSyncRules let inboundSyncRulePrecedence = (int)syncRule.Element("precedence") orderby inboundSyncRulePrecedence select syncRule; - var inboundSyncRuleRank = 0; // Used only for sorting, not displayed on the report - foreach (var inboundSyncRule in inboundSyncRules) + + //Get inbound MV object types from sync rules + var targetObjectTypeMV = (string)inboundSyncRules.First().Element("targetObjectType"); + List inboundMVTypes = new List(); + foreach (var inboundRule in inboundSyncRules) + { + inboundMVTypes.Add((string)inboundRule.Element("targetObjectType")); + } + if (inboundMVTypes.Distinct().Count() > 1) { - var inboundSyncRuleName = (string)inboundSyncRule.Element("name"); - var inboundSyncRuleGuid = (string)inboundSyncRule.Element("id"); - var targetObjectType = (string)inboundSyncRule.Element("targetObjectType"); - ++inboundSyncRuleRank; - - var transformation = inboundSyncRule.XPathSelectElement("./attribute-mappings/mapping[dest = '" + metaverseAttribute + "']"); - var expression = (string)transformation.Element("expression"); - var srcAttribute = (string)transformation.XPathSelectElement("src/attr"); - var src = (string)transformation.XPathSelectElement("src"); - var source = !string.IsNullOrEmpty(expression) ? expression : !string.IsNullOrEmpty(srcAttribute) ? srcAttribute : src; - - var inboundSyncRuleScopingConditions = inboundSyncRule.XPathSelectElements("./synchronizationCriteria/conditions"); - var inboundSyncRuleScopingConditionString = string.Empty; - var inboundSyncRuleScopingConditionsCount = inboundSyncRuleScopingConditions.Count(); - if (inboundSyncRuleScopingConditionsCount != 0) + throw new Exception("Inbound rules flow to multiple MV object types."); + } + // Outbound metaverse flows + var outboundSyncRules = config.XPathSelectElements(Documenter.GetSynchronizationRuleXmlRootXPath(pilotConfig) + "/synchronizationRule[direction = 'Outbound' " + Documenter.SyncRuleDisabledCondition + " and sourceObjectType = '" + targetObjectTypeMV + "' and (attribute-mappings/mapping/src/attr = '" + metaverseAttribute + "' or contains(attribute-mappings/mapping/expression, '[" + metaverseAttribute + "]'))]"); + outboundSyncRules = from syncRule in outboundSyncRules + let outboundSyncRulePrecedence = (int)syncRule.Element("precedence") + orderby outboundSyncRulePrecedence + select syncRule; + var outboundSyncRuleRank = 0; + + int outboundSyncCount = outboundSyncRules.Count(); + int inboundSyncCount = inboundSyncRules.Count(); + int largestSyncCount = 0; + if (outboundSyncCount > inboundSyncCount) + { + largestSyncCount = outboundSyncCount; + } + else + { + largestSyncCount = inboundSyncCount; + } + + for (int i = 0; i < largestSyncCount; i++) + { + string inboundSyncRuleName = ""; + string inboundSyncRuleGuid = ""; + string metaverseObjectType = ""; + string expression = ""; + string srcAttribute = ""; + string inboundExpression = ""; + string inboundSyncRuleScopingConditionString = ""; + string inboundFlowType = ""; + if (inboundSyncRules.ElementAtOrDefault(i) != null) { - var conditionIndex = -1; - foreach (var condition in inboundSyncRuleScopingConditions) + inboundSyncRuleName = (string)inboundSyncRules.ElementAt(i).Element("name"); + inboundSyncRuleGuid = (string)inboundSyncRules.ElementAt(i).Element("id"); + metaverseObjectType = (string)inboundSyncRules.ElementAt(i).Element("targetObjectType"); + ++inboundSyncRuleRank; + + if (inboundSyncRules.ElementAt(i).XPathSelectElements("./attribute-mappings/mapping[dest = '" + metaverseAttribute + "']").Count() > 1) { - ++conditionIndex; - var scopes = condition.Elements("scope"); - inboundSyncRuleScopingConditionString += scopes.Select(scope => string.Format(CultureInfo.InvariantCulture, "{0} {1} {2}", (string)scope.Element("csAttribute"), (string)scope.Element("csOperator"), (string)scope.Element("csValue"))).Aggregate((i, j) => i + " AND " + j); - if (conditionIndex < inboundSyncRuleScopingConditionsCount - 1) + string s = ""; + } + var transformation = inboundSyncRules.ElementAt(i).XPathSelectElement("./attribute-mappings/mapping[dest = '" + metaverseAttribute + "']"); + expression = (string)transformation.Element("expression"); + srcAttribute = (string)transformation.XPathSelectElement("src/attr"); + var src = (string)transformation.XPathSelectElement("src"); + inboundExpression = !string.IsNullOrEmpty(expression) ? expression : !string.IsNullOrEmpty(srcAttribute) ? srcAttribute : src; + inboundFlowType = !string.IsNullOrEmpty(expression) ? "Expression" : "Direct"; + + var inboundSyncRuleScopingConditions = inboundSyncRules.ElementAt(i).XPathSelectElements("./synchronizationCriteria/conditions"); + var inboundSyncRuleScopingConditionsCount = inboundSyncRuleScopingConditions.Count(); + if (inboundSyncRuleScopingConditionsCount != 0) + { + var conditionIndex = -1; + foreach (var condition in inboundSyncRuleScopingConditions) { - inboundSyncRuleScopingConditionString += " OR "; + ++conditionIndex; + var scopes = condition.Elements("scope"); + inboundSyncRuleScopingConditionString += scopes.Select(scope => string.Format(CultureInfo.InvariantCulture, "{0} {1} {2}", (string)scope.Element("csAttribute"), (string)scope.Element("csOperator"), (string)scope.Element("csValue"))).Aggregate((x, j) => x + "
AND
" + j); + if (conditionIndex < inboundSyncRuleScopingConditionsCount - 1) + { + inboundSyncRuleScopingConditionString += "
OR
"; + } } } } - - Documenter.AddRow(table2, new object[] { metaverseAttribute, source, inboundSyncRuleName, inboundSyncRuleRank, inboundSyncRuleScopingConditionString, inboundSyncRuleGuid }); - - if (table3.Select("MetaverseAttribute = '" + metaverseAttribute + "'").Count() == 0) + string outboundSyncRuleName = ""; + string outboundSyncRuleGuid = ""; + string outboundConnectorGuid = ""; + string outboundConnectorName = ""; + string mappingExpression = ""; + string mappingSourceAttribute = ""; + string mappingSource = ""; + string targetAttribute = ""; + string outboundExpression = ""; + string outboundSyncRuleScopingCondition = ""; + string outboundObjectType = ""; + string outboundFlowType = ""; + if (outboundSyncRules.ElementAtOrDefault(i) != null) { - Documenter.AddRow(table3, new object[] { metaverseAttribute, inboundSyncRuleName, "→" }); - - // Outbound metaverse flows - var outboundSyncRules = config.XPathSelectElements(Documenter.GetSynchronizationRuleXmlRootXPath(pilotConfig) + "/synchronizationRule[sourceObjectType = '" + targetObjectType + "' and direction = 'Outbound' " + Documenter.SyncRuleDisabledCondition + " and (attribute-mappings/mapping/src/attr = '" + metaverseAttribute + "' or contains(attribute-mappings/mapping/expression, '[" + metaverseAttribute + "]'))]"); - outboundSyncRules = from syncRule in outboundSyncRules - let outboundSyncRulePrecedence = (int)syncRule.Element("precedence") - orderby outboundSyncRulePrecedence - select syncRule; - var outboundSyncRuleRank = 0; - foreach (var outboundSyncRule in outboundSyncRules) + outboundSyncRuleName = (string)outboundSyncRules.ElementAt(i).Element("name"); + outboundSyncRuleGuid = (string)outboundSyncRules.ElementAt(i).Element("id"); + metaverseObjectType = (string)outboundSyncRules.ElementAt(i).Element("sourceObjectType"); + outboundConnectorGuid = ((string)outboundSyncRules.ElementAt(i).Element("connector") ?? string.Empty).ToUpperInvariant(); + outboundObjectType = (string)outboundSyncRules.ElementAt(i).Element("targetObjectType"); + outboundConnectorName = (string)config.XPathSelectElement(Documenter.GetConnectorXmlRootXPath(pilotConfig) + "/ma-data[translate(id, '" + Documenter.LowercaseLetters + "', '" + Documenter.UppercaseLetters + "') = '" + outboundConnectorGuid + "']/name"); + if (string.IsNullOrEmpty(outboundConnectorName)) { - var outboundSyncRuleName = (string)outboundSyncRule.Element("name"); - var outboundSyncRuleGuid = (string)outboundSyncRule.Element("id"); - var outboundConnectorGuid = ((string)outboundSyncRule.Element("connector") ?? string.Empty).ToUpperInvariant(); - var outboundConnectorName = (string)config.XPathSelectElement(Documenter.GetConnectorXmlRootXPath(pilotConfig) + "/ma-data[translate(id, '" + Documenter.LowercaseLetters + "', '" + Documenter.UppercaseLetters + "') = '" + outboundConnectorGuid + "']/name"); - if (string.IsNullOrEmpty(outboundConnectorName)) - { - Logger.Instance.WriteWarning(string.Format(CultureInfo.InvariantCulture, "Unable to dereferece connector: '{0}'. The documentation of outbound flows will be skipped for this connector. PilotConfig: '{1}'.", outboundConnectorGuid, pilotConfig)); - continue; - } - - ++outboundSyncRuleRank; // Used only for sorting, not displayed on the report + Logger.Instance.WriteWarning(string.Format(CultureInfo.InvariantCulture, "Unable to dereferece connector: '{0}'. The documentation of outbound flows will be skipped for this connector. PilotConfig: '{1}'.", outboundConnectorGuid, pilotConfig)); + continue; + } - var targetAttributeMapping = outboundSyncRule.XPathSelectElement("attribute-mappings/mapping[./src/attr = '" + metaverseAttribute + "' or contains(expression, '[" + metaverseAttribute + "]')]"); - var mappingExpression = (string)targetAttributeMapping.XPathSelectElement("./expression"); - var mappingSourceAttribute = (string)targetAttributeMapping.XPathSelectElement("./src/attr"); - var mappingSource = (string)targetAttributeMapping.XPathSelectElement("./src"); - var targetAttribute = (string)targetAttributeMapping.XPathSelectElement("./dest"); - var metaverseSource = (string)mappingExpression ?? (string)mappingSourceAttribute ?? (string)mappingSource ?? string.Empty; - if (!string.IsNullOrEmpty(metaverseSource)) + ++outboundSyncRuleRank; // Used only for sorting, not displayed on the report + var outboundFlows = outboundSyncRules.ElementAt(i).XPathSelectElements("attribute-mappings/mapping[./src/attr = '" + metaverseAttribute + "' or contains(expression, '[" + metaverseAttribute + "]')]"); + foreach (var outboundFlow in outboundFlows) + { + //reset between loops since below is += operation + outboundSyncRuleScopingCondition = ""; + + mappingExpression = (string)outboundFlow.XPathSelectElement("./expression"); + mappingSourceAttribute = (string)outboundFlow.XPathSelectElement("./src/attr"); + mappingSource = (string)outboundFlow.XPathSelectElement("./src"); + targetAttribute = (string)outboundFlow.XPathSelectElement("./dest"); + outboundExpression = !string.IsNullOrEmpty(mappingExpression) ? mappingExpression : !string.IsNullOrEmpty(mappingSourceAttribute) ? mappingSourceAttribute : mappingSource; + outboundFlowType = !string.IsNullOrEmpty(mappingExpression) ? "Expression" : "Direct"; + if (!string.IsNullOrEmpty(outboundExpression)) { - var outboundSyncRuleScopingConditions = outboundSyncRule.XPathSelectElements("./synchronizationCriteria/conditions"); - var outboundSyncRuleScopingCondition = string.Empty; + var outboundSyncRuleScopingConditions = outboundSyncRules.ElementAt(i).XPathSelectElements("./synchronizationCriteria/conditions"); var outboundSyncRuleScopingConditionCount = outboundSyncRuleScopingConditions.Count(); if (outboundSyncRuleScopingConditionCount != 0) { @@ -1541,16 +1535,17 @@ orderby outboundSyncRulePrecedence { ++conditionIndex; var scopes = condition.Elements("scope"); - outboundSyncRuleScopingCondition += scopes.Select(scope => string.Format(CultureInfo.InvariantCulture, "{0} {1} {2}", (string)scope.Element("csAttribute"), (string)scope.Element("csOperator"), (string)scope.Element("csValue"))).Aggregate((i, j) => i + " AND " + j); + outboundSyncRuleScopingCondition += scopes.Select(scope => string.Format(CultureInfo.InvariantCulture, "{0} {1} {2}", (string)scope.Element("csAttribute"), (string)scope.Element("csOperator"), (string)scope.Element("csValue"))).Aggregate((x, j) => x + "
AND
" + j); if (conditionIndex < outboundSyncRuleScopingConditionCount - 1) { - outboundSyncRuleScopingCondition += " OR "; + outboundSyncRuleScopingCondition += "
OR
"; } } } - - Documenter.AddRow(table4, new object[] { metaverseAttribute, inboundSyncRuleName, metaverseSource, targetAttribute, outboundSyncRuleRank, outboundSyncRuleName, outboundConnectorName, outboundSyncRuleScopingCondition, outboundConnectorGuid, outboundSyncRuleGuid }); } + //columns and order + //inboundSyncRuleName, inboundSyncRuleScopingConditionString, inboundExpression, inboundFlowType, inboundArrow, metaverseAttribute, metaverseObjectType, outboundArrow, outboundConnectorName, outboundSyncRuleName, outboundSyncRuleScopingConditionString, outboundObjectType, outboundExpression, outboundFlowType, targetAttribute + Documenter.AddRow(table, new object[] { inboundSyncRuleName, inboundSyncRuleScopingConditionString, inboundExpression, inboundFlowType, "→", metaverseAttribute, metaverseObjectType, "→", outboundConnectorName, outboundSyncRuleName, outboundSyncRuleScopingCondition, outboundObjectType, outboundExpression, outboundFlowType, targetAttribute }); } } } @@ -1558,9 +1553,6 @@ orderby outboundSyncRulePrecedence } table.AcceptChanges(); - table2.AcceptChanges(); - table3.AcceptChanges(); - table4.AcceptChanges(); } finally { @@ -1598,49 +1590,64 @@ protected DataTable GetConnectorObjectImportAttributeFlowsSummaryHeaderTable() { var headerTable = Documenter.GetHeaderTable(); + //columns and order + //inboundSyncRuleName, inboundSyncRuleScopingConditionString, inboundExpression, inboundFlowType, inboundArrow, metaverseAttribute, metaverseObjectType, outboundArrow, outboundConnectorName, outboundSyncRuleName, outboundSyncRuleScopingConditionString, outboundObjectType, outboundFlowType, outboundExpression, targetAttribute + // Header Row 1 // Import Flows headerTable.Rows.Add(new OrderedDictionary { { "RowIndex", 0 }, { "ColumnIndex", 0 }, { "ColumnName", "Import Flows" }, { "RowSpan", 1 }, { "ColSpan", 5 }, { "ColWidth", 0 } }.Values.Cast().ToArray()); + // MV Attribute + headerTable.Rows.Add(new OrderedDictionary { { "RowIndex", 0 }, { "ColumnIndex", 1 }, { "ColumnName", "Metaverse" }, { "RowSpan", 1 }, { "ColSpan", 3 }, { "ColWidth", 0 } }.Values.Cast().ToArray()); + // Export Flows - headerTable.Rows.Add(new OrderedDictionary { { "RowIndex", 0 }, { "ColumnIndex", 1 }, { "ColumnName", "Export Flows" }, { "RowSpan", 1 }, { "ColSpan", 7 }, { "ColWidth", 0 } }.Values.Cast().ToArray()); + headerTable.Rows.Add(new OrderedDictionary { { "RowIndex", 0 }, { "ColumnIndex", 2 }, { "ColumnName", "Export Flows" }, { "RowSpan", 1 }, { "ColSpan", 7 }, { "ColWidth", 0 } }.Values.Cast().ToArray()); // Header Row 2 - // Metaverse attribute - headerTable.Rows.Add(new OrderedDictionary { { "RowIndex", 1 }, { "ColumnIndex", 0 }, { "ColumnName", "Metaverse Attribute" }, { "RowSpan", 1 }, { "ColSpan", 1 }, { "ColWidth", 8 } }.Values.Cast().ToArray()); + // Inbound Sync Rule Name + headerTable.Rows.Add(new OrderedDictionary { { "RowIndex", 1 }, { "ColumnIndex", 0 }, { "ColumnName", "Inbound Sync Rule" }, { "RowSpan", 1 }, { "ColSpan", 1 }, { "ColWidth", 10 } }.Values.Cast().ToArray()); - // Flow Direction - headerTable.Rows.Add(new OrderedDictionary { { "RowIndex", 1 }, { "ColumnIndex", 1 }, { "ColumnName", "←" }, { "RowSpan", 1 }, { "ColSpan", 1 }, { "ColWidth", 2 } }.Values.Cast().ToArray()); + // Inbound Sync Rule Scoping Condition String + headerTable.Rows.Add(new OrderedDictionary { { "RowIndex", 1 }, { "ColumnIndex", 1 }, { "ColumnName", "Inbound Sync Rule Scoping Condition" }, { "RowSpan", 1 }, { "ColSpan", 1 }, { "ColWidth", 10 } }.Values.Cast().ToArray()); - // Source - headerTable.Rows.Add(new OrderedDictionary { { "RowIndex", 1 }, { "ColumnIndex", 2 }, { "ColumnName", "Connector Source" }, { "RowSpan", 1 }, { "ColSpan", 1 }, { "ColWidth", 10 } }.Values.Cast().ToArray()); + // Inbound Expression + headerTable.Rows.Add(new OrderedDictionary { { "RowIndex", 1 }, { "ColumnIndex", 2 }, { "ColumnName", "Inbound Expression" }, { "RowSpan", 1 }, { "ColSpan", 1 }, { "ColWidth", 10 } }.Values.Cast().ToArray()); - // Inbound Sync Rule - headerTable.Rows.Add(new OrderedDictionary { { "RowIndex", 1 }, { "ColumnIndex", 3 }, { "ColumnName", "Inbound Sync Rule" }, { "RowSpan", 1 }, { "ColSpan", 1 }, { "ColWidth", 10 } }.Values.Cast().ToArray()); + // Inbound Flow Type + headerTable.Rows.Add(new OrderedDictionary { { "RowIndex", 1 }, { "ColumnIndex", 3 }, { "ColumnName", "Inbound Flow Type" }, { "RowSpan", 1 }, { "ColSpan", 1 }, { "ColWidth", 10 } }.Values.Cast().ToArray()); - // Inbound Sync Rule Scoping Condition - headerTable.Rows.Add(new OrderedDictionary { { "RowIndex", 1 }, { "ColumnIndex", 4 }, { "ColumnName", "Inbound Sync Rule Scoping Condition" }, { "RowSpan", 1 }, { "ColSpan", 1 }, { "ColWidth", 10 } }.Values.Cast().ToArray()); + // Inbound Arrow + headerTable.Rows.Add(new OrderedDictionary { { "RowIndex", 1 }, { "ColumnIndex", 4 }, { "ColumnName", "→" }, { "RowSpan", 1 }, { "ColSpan", 1 }, { "ColWidth", 2 } }.Values.Cast().ToArray()); // Metaverse attribute headerTable.Rows.Add(new OrderedDictionary { { "RowIndex", 1 }, { "ColumnIndex", 5 }, { "ColumnName", "Metaverse Attribute" }, { "RowSpan", 1 }, { "ColSpan", 1 }, { "ColWidth", 8 } }.Values.Cast().ToArray()); - // Flow Direction - headerTable.Rows.Add(new OrderedDictionary { { "RowIndex", 1 }, { "ColumnIndex", 6 }, { "ColumnName", "→" }, { "RowSpan", 1 }, { "ColSpan", 1 }, { "ColWidth", 2 } }.Values.Cast().ToArray()); + // Metaverse Object Type + headerTable.Rows.Add(new OrderedDictionary { { "RowIndex", 1 }, { "ColumnIndex", 6 }, { "ColumnName", "Metaverse Object Type" }, { "RowSpan", 1 }, { "ColSpan", 1 }, { "ColWidth", 8 } }.Values.Cast().ToArray()); - // Source - headerTable.Rows.Add(new OrderedDictionary { { "RowIndex", 1 }, { "ColumnIndex", 7 }, { "ColumnName", "Source" }, { "RowSpan", 1 }, { "ColSpan", 1 }, { "ColWidth", 10 } }.Values.Cast().ToArray()); + // Outbound Arrow + headerTable.Rows.Add(new OrderedDictionary { { "RowIndex", 1 }, { "ColumnIndex", 7 }, { "ColumnName", "→" }, { "RowSpan", 1 }, { "ColSpan", 1 }, { "ColWidth", 2 } }.Values.Cast().ToArray()); - // Target - headerTable.Rows.Add(new OrderedDictionary { { "RowIndex", 1 }, { "ColumnIndex", 8 }, { "ColumnName", "Target" }, { "RowSpan", 1 }, { "ColSpan", 1 }, { "ColWidth", 10 } }.Values.Cast().ToArray()); + // Outbound Connector Name + headerTable.Rows.Add(new OrderedDictionary { { "RowIndex", 1 }, { "ColumnIndex", 8 }, { "ColumnName", "Outbound Connector" }, { "RowSpan", 1 }, { "ColSpan", 1 }, { "ColWidth", 10 } }.Values.Cast().ToArray()); - // Outbound Sync Rule + // Outbound Sync Rule Name headerTable.Rows.Add(new OrderedDictionary { { "RowIndex", 1 }, { "ColumnIndex", 9 }, { "ColumnName", "Outbound Sync Rule" }, { "RowSpan", 1 }, { "ColSpan", 1 }, { "ColWidth", 10 } }.Values.Cast().ToArray()); - // Target Connector - headerTable.Rows.Add(new OrderedDictionary { { "RowIndex", 1 }, { "ColumnIndex", 10 }, { "ColumnName", "Target Connector" }, { "RowSpan", 1 }, { "ColSpan", 1 }, { "ColWidth", 10 } }.Values.Cast().ToArray()); + // Outbound Sync Rule Scoping Condition String + headerTable.Rows.Add(new OrderedDictionary { { "RowIndex", 1 }, { "ColumnIndex", 10 }, { "ColumnName", "Outbound Sync Rule Scoping Condition" }, { "RowSpan", 1 }, { "ColSpan", 1 }, { "ColWidth", 10 } }.Values.Cast().ToArray()); + + // Outbound Object Type + headerTable.Rows.Add(new OrderedDictionary { { "RowIndex", 1 }, { "ColumnIndex", 11 }, { "ColumnName", "Outbound Object Type" }, { "RowSpan", 1 }, { "ColSpan", 1 }, { "ColWidth", 10 } }.Values.Cast().ToArray()); - // Outbound Sync Rule Scoping Condition - headerTable.Rows.Add(new OrderedDictionary { { "RowIndex", 1 }, { "ColumnIndex", 11 }, { "ColumnName", "Outbound Sync Rule Scoping Condition" }, { "RowSpan", 1 }, { "ColSpan", 1 }, { "ColWidth", 10 } }.Values.Cast().ToArray()); + // Outbound Flow Type + headerTable.Rows.Add(new OrderedDictionary { { "RowIndex", 1 }, { "ColumnIndex", 12 }, { "ColumnName", "Outbound Flow Type" }, { "RowSpan", 1 }, { "ColSpan", 1 }, { "ColWidth", 10 } }.Values.Cast().ToArray()); + + // Outbound Expression + headerTable.Rows.Add(new OrderedDictionary { { "RowIndex", 1 }, { "ColumnIndex", 13 }, { "ColumnName", "Outbound Expression" }, { "RowSpan", 1 }, { "ColSpan", 1 }, { "ColWidth", 10 } }.Values.Cast().ToArray()); + + // Target Attribute + headerTable.Rows.Add(new OrderedDictionary { { "RowIndex", 1 }, { "ColumnIndex", 14 }, { "ColumnName", "Target Attribute" }, { "RowSpan", 1 }, { "ColSpan", 1 }, { "ColWidth", 10 } }.Values.Cast().ToArray()); headerTable.AcceptChanges(); @@ -1711,90 +1718,49 @@ protected void ProcessConnectorObjectExportAttributeFlowsSummary() protected void CreateConnectorObjectExportAttributeFlowsSummaryDataSets() { Logger.Instance.WriteMethodEntry(); - + //columns and order + //inboundSyncRuleName, inboundSyncRuleScopingConditionString, inboundExpression, inboundFlowType, inboundArrow, metaverseAttribute, metaverseObjectType, outboundArrow, outboundConnectorName, outboundSyncRuleName, outboundSyncRuleScopingConditionString, outboundObjectType, outboundExpression, outboundFlowType, targetAttribute try { - var table = new DataTable("DataSourceAttributes") { Locale = CultureInfo.InvariantCulture }; - - var column1 = new DataColumn("DataSourceAttribute"); - var column2 = new DataColumn("FlowDirection"); + var table = new DataTable("ExportSummary") { Locale = CultureInfo.InvariantCulture }; + var column1 = new DataColumn("inboundSyncRuleName"); + var column2 = new DataColumn("inboundSyncRuleScopingConditionString"); + var column3 = new DataColumn("inboundExpression"); + var column4 = new DataColumn("inboundFlowType"); + var column5 = new DataColumn("inboundArrow"); + var column6 = new DataColumn("metaverseAttribute"); + var column7 = new DataColumn("metaverseObjectType"); + var column8 = new DataColumn("outboundArrow"); + var column9 = new DataColumn("outboundConnectorName"); + var column10 = new DataColumn("outboundSyncRuleName"); + var column11 = new DataColumn("outboundSyncRuleScopingConditionString"); + var column12 = new DataColumn("outboundObjectType"); + var column13 = new DataColumn("outboundExpression"); + var column14 = new DataColumn("outboundFlowType"); + var column15 = new DataColumn("targetAttribute"); table.Columns.Add(column1); table.Columns.Add(column2); - table.PrimaryKey = new[] { column1 }; - - var table2 = new DataTable("OutboundSyncRules") { Locale = CultureInfo.InvariantCulture }; - - var column12 = new DataColumn("DataSourceAttribute"); // to be able to do cascading data relations - var column22 = new DataColumn("Source"); - var column32 = new DataColumn("OutboundSyncRule"); - var column42 = new DataColumn("OutboundSyncRulePrecedence", typeof(int)); - var column52 = new DataColumn("OutboundSyncRuleScopingCondition"); - var column62 = new DataColumn("OutboundSyncRuleGuid"); - - table2.Columns.Add(column12); - table2.Columns.Add(column22); - table2.Columns.Add(column32); - table2.Columns.Add(column42); - table2.Columns.Add(column52); - table2.Columns.Add(column62); - table2.PrimaryKey = new[] { column12, column32 }; - - var table3 = new DataTable("MetaverseAttributes") { Locale = CultureInfo.InvariantCulture }; - - var column13 = new DataColumn("DataSourceAttribute"); - var column23 = new DataColumn("OutboundSyncRule"); - var column33 = new DataColumn("MetaverseAttribute"); - var column43 = new DataColumn("FlowDirection"); - - table3.Columns.Add(column13); - table3.Columns.Add(column23); - table3.Columns.Add(column33); - table3.Columns.Add(column43); - table3.PrimaryKey = new[] { column13, column23, column33 }; - - var table4 = new DataTable("MetaverseObjectTypeInboundFlows") { Locale = CultureInfo.InvariantCulture }; - - var column14 = new DataColumn("DataSourceAttribute"); - var column24 = new DataColumn("OutboundSyncRule"); - var column34 = new DataColumn("MetaverseAttribute"); - var column44 = new DataColumn("Source"); - var column54 = new DataColumn("InboundSyncRulePrecedence", typeof(int)); - var column64 = new DataColumn("InboundSyncRule"); - var column74 = new DataColumn("SourceConnector"); - var column84 = new DataColumn("InboundSyncRuleScopingCondition"); - var column94 = new DataColumn("SourceConnectorGuid"); - var column104 = new DataColumn("InboundSyncRuleGuid"); - - table4.Columns.Add(column14); - table4.Columns.Add(column24); - table4.Columns.Add(column34); - table4.Columns.Add(column44); - table4.Columns.Add(column54); - table4.Columns.Add(column64); - table4.Columns.Add(column74); - table4.Columns.Add(column84); - table4.Columns.Add(column94); - table4.Columns.Add(column104); - table4.PrimaryKey = new[] { column14, column34, column64, column74 }; // column24 is excluded as we'll insert only one row in the the parent table. + table.Columns.Add(column3); + table.Columns.Add(column4); + table.Columns.Add(column5); + table.Columns.Add(column6); + table.Columns.Add(column7); + table.Columns.Add(column8); + table.Columns.Add(column9); + table.Columns.Add(column10); + table.Columns.Add(column11); + table.Columns.Add(column12); + table.Columns.Add(column13); + table.Columns.Add(column14); + table.Columns.Add(column15); + table.PrimaryKey = new[] { column1, column2, column3, column4, column5, column6, column7, column8, column9, column10, column11, column12, column13, column14, column15 }; this.PilotDataSet = new DataSet("ExportAttributeFlowsSummary") { Locale = CultureInfo.InvariantCulture }; this.PilotDataSet.Tables.Add(table); - this.PilotDataSet.Tables.Add(table2); - this.PilotDataSet.Tables.Add(table3); - this.PilotDataSet.Tables.Add(table4); - - var dataRelation12 = new DataRelation("DataRelation12", new[] { column1 }, new[] { column12 }, false); - var dataRelation23 = new DataRelation("DataRelation23", new[] { column12, column32 }, new[] { column13, column23 }, false); - var dataRelation34 = new DataRelation("DataRelation34", new[] { column13, column23, column33 }, new[] { column14, column24, column34 }, false); - - this.PilotDataSet.Relations.Add(dataRelation12); - this.PilotDataSet.Relations.Add(dataRelation23); - this.PilotDataSet.Relations.Add(dataRelation34); - this.ProductionDataSet = this.PilotDataSet.Clone(); - var printTable = this.GetConnectorObjectExportAttributeFlowsSummaryPrintTable(); + var printTable = this.GetConnectorObjectImportAttributeFlowsSummaryPrintTable(); this.PilotDataSet.Tables.Add(printTable); this.ProductionDataSet.Tables.Add(printTable.Copy()); } @@ -1815,64 +1781,53 @@ protected DataTable GetConnectorObjectExportAttributeFlowsSummaryPrintTable() try { var printTable = Documenter.GetPrintTable(); + //columns and order + //inboundSyncRuleName, inboundSyncRuleScopingConditionString, inboundExpression, inboundFlowType, inboundArrow, metaverseAttribute, metaverseObjectType, outboundArrow, outboundConnectorName, outboundSyncRuleName, outboundSyncRuleScopingConditionString, outboundObjectType, outboundExpression, outboundFlowType,targetAttribute - // Table 1 - // DataSource Attribute - printTable.Rows.Add(new OrderedDictionary { { "TableIndex", 0 }, { "ColumnIndex", 0 }, { "Hidden", false }, { "SortOrder", 0 }, { "BookmarkIndex", -1 }, { "JumpToBookmarkIndex", -1 }, { "ChangeIgnored", false } }.Values.Cast().ToArray()); - - // Flow Direction - printTable.Rows.Add(new OrderedDictionary { { "TableIndex", 0 }, { "ColumnIndex", 1 }, { "Hidden", false }, { "SortOrder", -1 }, { "BookmarkIndex", -1 }, { "JumpToBookmarkIndex", -1 }, { "ChangeIgnored", true } }.Values.Cast().ToArray()); - - // Table 2 - // Source - printTable.Rows.Add(new OrderedDictionary { { "TableIndex", 1 }, { "ColumnIndex", 1 }, { "Hidden", false }, { "SortOrder", -1 }, { "BookmarkIndex", -1 }, { "JumpToBookmarkIndex", -1 }, { "ChangeIgnored", false } }.Values.Cast().ToArray()); - - // Outbound Sync Rule - printTable.Rows.Add(new OrderedDictionary { { "TableIndex", 1 }, { "ColumnIndex", 2 }, { "Hidden", false }, { "SortOrder", -1 }, { "BookmarkIndex", -1 }, { "JumpToBookmarkIndex", 5 }, { "ChangeIgnored", false } }.Values.Cast().ToArray()); + // Inbound Sync Rule Name + printTable.Rows.Add(new OrderedDictionary { { "TableIndex", 0 }, { "ColumnIndex", 0 }, { "Hidden", false }, { "SortOrder", -1 }, { "BookmarkIndex", -1 }, { "JumpToBookmarkIndex", 5 }, { "ChangeIgnored", false } }.Values.Cast().ToArray()); - // Outbound Sync Rule Precedence - printTable.Rows.Add(new OrderedDictionary { { "TableIndex", 1 }, { "ColumnIndex", 3 }, { "Hidden", true }, { "SortOrder", 0 }, { "BookmarkIndex", -1 }, { "JumpToBookmarkIndex", -1 }, { "ChangeIgnored", false } }.Values.Cast().ToArray()); + // Inbound Sync Rule Scoping Condition String + printTable.Rows.Add(new OrderedDictionary { { "TableIndex", 0 }, { "ColumnIndex", 1 }, { "Hidden", false }, { "SortOrder", -1 }, { "BookmarkIndex", -1 }, { "JumpToBookmarkIndex", -1 }, { "ChangeIgnored", false } }.Values.Cast().ToArray()); - // Outbound Sync Rule Scoping Condition - printTable.Rows.Add(new OrderedDictionary { { "TableIndex", 1 }, { "ColumnIndex", 4 }, { "Hidden", false }, { "SortOrder", -1 }, { "BookmarkIndex", -1 }, { "JumpToBookmarkIndex", -1 }, { "ChangeIgnored", false } }.Values.Cast().ToArray()); + // Inbound Expression + printTable.Rows.Add(new OrderedDictionary { { "TableIndex", 0 }, { "ColumnIndex", 2 }, { "Hidden", false }, { "SortOrder", -1 }, { "BookmarkIndex", -1 }, { "JumpToBookmarkIndex", -1 }, { "ChangeIgnored", false } }.Values.Cast().ToArray()); - // Outbound Sync Rule Guid - printTable.Rows.Add(new OrderedDictionary { { "TableIndex", 1 }, { "ColumnIndex", 5 }, { "Hidden", true }, { "SortOrder", -1 }, { "BookmarkIndex", -1 }, { "JumpToBookmarkIndex", -1 }, { "ChangeIgnored", true } }.Values.Cast().ToArray()); + // Inbound Flow Type + printTable.Rows.Add(new OrderedDictionary { { "TableIndex", 0 }, { "ColumnIndex", 3 }, { "Hidden", false }, { "SortOrder", -1 }, { "BookmarkIndex", -1 }, { "JumpToBookmarkIndex", -1 }, { "ChangeIgnored", true } }.Values.Cast().ToArray()); - // Table 3 - // Outbound Sync Rule Name - printTable.Rows.Add(new OrderedDictionary { { "TableIndex", 2 }, { "ColumnIndex", 1 }, { "Hidden", true }, { "SortOrder", -1 }, { "BookmarkIndex", -1 }, { "JumpToBookmarkIndex", -1 }, { "ChangeIgnored", true } }.Values.Cast().ToArray()); + // Inbound Arrow + printTable.Rows.Add(new OrderedDictionary { { "TableIndex", 0 }, { "ColumnIndex", 4 }, { "Hidden", false }, { "SortOrder", -1 }, { "BookmarkIndex", -1 }, { "JumpToBookmarkIndex", -1 }, { "ChangeIgnored", true } }.Values.Cast().ToArray()); // Metaverse Attribute - printTable.Rows.Add(new OrderedDictionary { { "TableIndex", 2 }, { "ColumnIndex", 2 }, { "Hidden", false }, { "SortOrder", 0 }, { "BookmarkIndex", -1 }, { "JumpToBookmarkIndex", -1 }, { "ChangeIgnored", false } }.Values.Cast().ToArray()); + printTable.Rows.Add(new OrderedDictionary { { "TableIndex", 0 }, { "ColumnIndex", 5 }, { "Hidden", false }, { "SortOrder", 0 }, { "BookmarkIndex", -1 }, { "JumpToBookmarkIndex", -1 }, { "ChangeIgnored", false } }.Values.Cast().ToArray()); - // Flow Direction - printTable.Rows.Add(new OrderedDictionary { { "TableIndex", 2 }, { "ColumnIndex", 3 }, { "Hidden", false }, { "SortOrder", -1 }, { "BookmarkIndex", -1 }, { "JumpToBookmarkIndex", -1 }, { "ChangeIgnored", true } }.Values.Cast().ToArray()); + // Metaverse Object Type + printTable.Rows.Add(new OrderedDictionary { { "TableIndex", 0 }, { "ColumnIndex", 6 }, { "Hidden", false }, { "SortOrder", 0 }, { "BookmarkIndex", -1 }, { "JumpToBookmarkIndex", -1 }, { "ChangeIgnored", false } }.Values.Cast().ToArray()); - // Table 4 - // Outbound Sync Rule Name - printTable.Rows.Add(new OrderedDictionary { { "TableIndex", 3 }, { "ColumnIndex", 1 }, { "Hidden", true }, { "SortOrder", -1 }, { "BookmarkIndex", -1 }, { "JumpToBookmarkIndex", -1 }, { "ChangeIgnored", true } }.Values.Cast().ToArray()); + // Outbound Arrow + printTable.Rows.Add(new OrderedDictionary { { "TableIndex", 0 }, { "ColumnIndex", 7 }, { "Hidden", false }, { "SortOrder", -1 }, { "BookmarkIndex", -1 }, { "JumpToBookmarkIndex", -1 }, { "ChangeIgnored", true } }.Values.Cast().ToArray()); - // Source - printTable.Rows.Add(new OrderedDictionary { { "TableIndex", 3 }, { "ColumnIndex", 3 }, { "Hidden", false }, { "SortOrder", -1 }, { "BookmarkIndex", -1 }, { "JumpToBookmarkIndex", -1 }, { "ChangeIgnored", false } }.Values.Cast().ToArray()); + // Outbound Connector Name + printTable.Rows.Add(new OrderedDictionary { { "TableIndex", 0 }, { "ColumnIndex", 8 }, { "Hidden", false }, { "SortOrder", -1 }, { "BookmarkIndex", -1 }, { "JumpToBookmarkIndex", 8 }, { "ChangeIgnored", false } }.Values.Cast().ToArray()); - // Inbound Sync Rule Precedence - printTable.Rows.Add(new OrderedDictionary { { "TableIndex", 3 }, { "ColumnIndex", 4 }, { "Hidden", true }, { "SortOrder", 0 }, { "BookmarkIndex", -1 }, { "JumpToBookmarkIndex", -1 }, { "ChangeIgnored", false } }.Values.Cast().ToArray()); + // Outbound Sync Rule Name + printTable.Rows.Add(new OrderedDictionary { { "TableIndex", 0 }, { "ColumnIndex", 9 }, { "Hidden", false }, { "SortOrder", -1 }, { "BookmarkIndex", -1 }, { "JumpToBookmarkIndex", 9 }, { "ChangeIgnored", false } }.Values.Cast().ToArray()); - // Inbound Sync Rule - printTable.Rows.Add(new OrderedDictionary { { "TableIndex", 3 }, { "ColumnIndex", 5 }, { "Hidden", false }, { "SortOrder", -1 }, { "BookmarkIndex", -1 }, { "JumpToBookmarkIndex", 9 }, { "ChangeIgnored", false } }.Values.Cast().ToArray()); + // Outbound Sync Rule Scoping Condition String + printTable.Rows.Add(new OrderedDictionary { { "TableIndex", 0 }, { "ColumnIndex", 10 }, { "Hidden", false }, { "SortOrder", -1 }, { "BookmarkIndex", -1 }, { "JumpToBookmarkIndex", -1 }, { "ChangeIgnored", false } }.Values.Cast().ToArray()); - // Source Connector - printTable.Rows.Add(new OrderedDictionary { { "TableIndex", 3 }, { "ColumnIndex", 6 }, { "Hidden", false }, { "SortOrder", -1 }, { "BookmarkIndex", -1 }, { "JumpToBookmarkIndex", 8 }, { "ChangeIgnored", false } }.Values.Cast().ToArray()); + // Outbound Object Type + printTable.Rows.Add(new OrderedDictionary { { "TableIndex", 0 }, { "ColumnIndex", 11 }, { "Hidden", false }, { "SortOrder", -1 }, { "BookmarkIndex", -1 }, { "JumpToBookmarkIndex", -1 }, { "ChangeIgnored", false } }.Values.Cast().ToArray()); - // Inbound Sync Rule Scoping Condition - printTable.Rows.Add(new OrderedDictionary { { "TableIndex", 3 }, { "ColumnIndex", 7 }, { "Hidden", false }, { "SortOrder", -1 }, { "BookmarkIndex", -1 }, { "JumpToBookmarkIndex", -1 }, { "ChangeIgnored", false } }.Values.Cast().ToArray()); + // Outbound Expression + printTable.Rows.Add(new OrderedDictionary { { "TableIndex", 0 }, { "ColumnIndex", 12 }, { "Hidden", false }, { "SortOrder", -1 }, { "BookmarkIndex", -1 }, { "JumpToBookmarkIndex", -1 }, { "ChangeIgnored", false } }.Values.Cast().ToArray()); - // Source Connector Guid - printTable.Rows.Add(new OrderedDictionary { { "TableIndex", 3 }, { "ColumnIndex", 8 }, { "Hidden", true }, { "SortOrder", -1 }, { "BookmarkIndex", -1 }, { "JumpToBookmarkIndex", -1 }, { "ChangeIgnored", true } }.Values.Cast().ToArray()); + // Outbound Flow Type + printTable.Rows.Add(new OrderedDictionary { { "TableIndex", 0 }, { "ColumnIndex", 13 }, { "Hidden", false }, { "SortOrder", -1 }, { "BookmarkIndex", -1 }, { "JumpToBookmarkIndex", -1 }, { "ChangeIgnored", true } }.Values.Cast().ToArray()); - // Inbound Sync Rule Guid - printTable.Rows.Add(new OrderedDictionary { { "TableIndex", 3 }, { "ColumnIndex", 9 }, { "Hidden", true }, { "SortOrder", -1 }, { "BookmarkIndex", -1 }, { "JumpToBookmarkIndex", -1 }, { "ChangeIgnored", true } }.Values.Cast().ToArray()); + // Target Attribute + printTable.Rows.Add(new OrderedDictionary { { "TableIndex", 0 }, { "ColumnIndex", 14 }, { "Hidden", false }, { "SortOrder", -1 }, { "BookmarkIndex", -1 }, { "JumpToBookmarkIndex", -1 }, { "ChangeIgnored", false } }.Values.Cast().ToArray()); printTable.AcceptChanges(); @@ -1891,6 +1846,8 @@ protected DataTable GetConnectorObjectExportAttributeFlowsSummaryPrintTable() protected void FillConnectorObjectExportAttributeFlowsSummary(bool pilotConfig) { Logger.Instance.WriteMethodEntry("Pilot Config: '{0}'.", pilotConfig); + //columns and order + //inboundSyncRuleName, inboundSyncRuleScopingConditionString, inboundExpression, inboundFlowType, inboundArrow, metaverseAttribute, metaverseObjectType, outboundArrow, outboundConnectorName, outboundSyncRuleName, outboundSyncRuleScopingConditionString, outboundObjectType, outboundExpression, outboundFlowType, targetAttribute try { @@ -1898,135 +1855,178 @@ protected void FillConnectorObjectExportAttributeFlowsSummary(bool pilotConfig) var dataSet = pilotConfig ? this.PilotDataSet : this.ProductionDataSet; var table = dataSet.Tables[0]; - var table2 = dataSet.Tables[1]; - var table3 = dataSet.Tables[2]; - var table4 = dataSet.Tables[3]; var connector = config.XPathSelectElement(Documenter.GetConnectorXmlRootXPath(pilotConfig) + "/ma-data[name ='" + this.ConnectorName + "']"); if (connector != null) { var connectorGuid = ((string)connector.Element("id") ?? string.Empty).ToUpperInvariant(); - var targetAttributesXPath = Documenter.GetSynchronizationRuleXmlRootXPath(pilotConfig) + "/synchronizationRule[translate(connector, '" + Documenter.LowercaseLetters + "', '" + Documenter.UppercaseLetters + "') = '" + connectorGuid + "' and direction = 'Outbound' " + Documenter.SyncRuleDisabledCondition + " and targetObjectType = '" + this.currentDataSourceObjectType + "']/attribute-mappings/mapping/dest"; - var targetAttributes = from outboundSyncRuleDestination in config.XPathSelectElements(targetAttributesXPath) - let dest = (string)outboundSyncRuleDestination - orderby dest - select dest; - - foreach (var targetAttribute in targetAttributes.Distinct()) + var metaverseAttributesXPath = Documenter.GetSynchronizationRuleXmlRootXPath(pilotConfig) + "/synchronizationRule[translate(connector, '" + Documenter.LowercaseLetters + "', '" + Documenter.UppercaseLetters + "') = '" + connectorGuid + "' and direction = 'Outbound' " + Documenter.SyncRuleDisabledCondition + " and targetObjectType = '" + this.currentDataSourceObjectType + "']/attribute-mappings/mapping/src/attr"; + var metaverseAttributes = from outboundSyncRuleDestination in config.XPathSelectElements(metaverseAttributesXPath) + let dest = (string)outboundSyncRuleDestination + orderby dest + select dest; + //foreach (var metaverseAttribute in metaverseAttributes.Distinct()) + foreach (var metaverseAttribute in metaverseAttributes.Distinct()) { - Documenter.AddRow(table, new object[] { targetAttribute, "←" }); + //Documenter.AddRow(table, new object[] { metaverseAttribute, "←" }); - var outboundSyncRuleXPath = Documenter.GetSynchronizationRuleXmlRootXPath(pilotConfig) + "/synchronizationRule[translate(connector, '" + Documenter.LowercaseLetters + "', '" + Documenter.UppercaseLetters + "') = '" + connectorGuid + "' and direction = 'Outbound' " + Documenter.SyncRuleDisabledCondition + " and targetObjectType = '" + this.currentDataSourceObjectType + "' and ./attribute-mappings/mapping/dest = '" + targetAttribute + "']"; - var outboundSyncRules = config.XPathSelectElements(outboundSyncRuleXPath); + // Outbound metaverse flows + var outboundSyncRules = config.XPathSelectElements(Documenter.GetSynchronizationRuleXmlRootXPath(pilotConfig) + "/synchronizationRule[direction = 'Outbound' " + Documenter.SyncRuleDisabledCondition + " and targetObjectType = '" + this.currentDataSourceObjectType + "' and (attribute-mappings/mapping/src/attr = '" + metaverseAttribute + "' or contains(attribute-mappings/mapping/expression, '[" + metaverseAttribute + "]'))]"); outboundSyncRules = from syncRule in outboundSyncRules - let precedence = (int)syncRule.Element("precedence") - orderby precedence + let outboundSyncRulePrecedence = (int)syncRule.Element("precedence") + orderby outboundSyncRulePrecedence select syncRule; + var outboundSyncRuleRank = 0; + + //Get inbound MV object types from sync rules + string sourceObjectTypeMV = ""; + if (outboundSyncRules.Count() == 0) + { + sourceObjectTypeMV = this.currentDataSourceObjectType; + } + else + { + sourceObjectTypeMV = (string)outboundSyncRules.First().Element("sourceObjectType"); + } + List outboundMVTypes = new List(); + foreach (var outboundRule in outboundSyncRules) + { + outboundMVTypes.Add((string)outboundRule.Element("targetObjectType")); + } + if (outboundMVTypes.Distinct().Count() > 1) + { + throw new Exception("Outbound rules flow to multiple MV object types."); + } + + var inboundSyncRuleXPath = Documenter.GetSynchronizationRuleXmlRootXPath(pilotConfig) + "/synchronizationRule[direction = 'Inbound' " + Documenter.SyncRuleDisabledCondition + " and targetObjectType = '" + sourceObjectTypeMV + "' and ./attribute-mappings/mapping/dest = '" + metaverseAttribute + "']"; + var inboundSyncRules = config.XPathSelectElements(inboundSyncRuleXPath); + inboundSyncRules = from syncRule in inboundSyncRules + let inboundSyncRulePrecedence = (int)syncRule.Element("precedence") + orderby inboundSyncRulePrecedence + select syncRule; + var inboundSyncRuleRank = 0; // Used only for sorting, not displayed on the report - var outboundSyncRuleRank = 0; // Used only for sorting, not displayed on the report - foreach (var outboundSyncRule in outboundSyncRules) + int outboundSyncCount = outboundSyncRules.Count(); + int inboundSyncCount = inboundSyncRules.Count(); + int largestSyncCount = 0; + if (outboundSyncCount > inboundSyncCount) { - var outboundSyncRuleName = (string)outboundSyncRule.Element("name"); - var outboundSyncRuleGuid = (string)outboundSyncRule.Element("id"); - var sourceObjectType = (string)outboundSyncRule.Element("sourceObjectType"); - ++outboundSyncRuleRank; - - var transformation = outboundSyncRule.XPathSelectElement("./attribute-mappings/mapping[dest = '" + targetAttribute + "']"); - var expression = (string)transformation.Element("expression"); - var srcAttribute = (string)transformation.XPathSelectElement("src/attr"); - var src = (string)transformation.XPathSelectElement("src"); - var source = !string.IsNullOrEmpty(expression) ? expression : !string.IsNullOrEmpty(srcAttribute) ? srcAttribute : src; - - var outboundSyncRuleScopingConditions = outboundSyncRule.XPathSelectElements("./synchronizationCriteria/conditions"); - var outboundSyncRuleScopingConditionString = string.Empty; - var outboundSyncRuleScopingConditionsCount = outboundSyncRuleScopingConditions.Count(); - if (outboundSyncRuleScopingConditionsCount != 0) + largestSyncCount = outboundSyncCount; + } + else + { + largestSyncCount = inboundSyncCount; + } + + for (int i = 0; i < largestSyncCount; i++) + { + string inboundSyncRuleName = ""; + string inboundSyncRuleGuid = ""; + string metaverseObjectType = ""; + string expression = ""; + string srcAttribute = ""; + string inboundExpression = ""; + string inboundSyncRuleScopingConditionString = ""; + string inboundFlowType = ""; + + if (inboundSyncRules.ElementAtOrDefault(i) != null) { - var conditionIndex = -1; - foreach (var condition in outboundSyncRuleScopingConditions) + inboundSyncRuleName = (string)inboundSyncRules.ElementAt(i).Element("name"); + inboundSyncRuleGuid = (string)inboundSyncRules.ElementAt(i).Element("id"); + metaverseObjectType = (string)inboundSyncRules.ElementAt(i).Element("targetObjectType"); + ++inboundSyncRuleRank; + if (inboundSyncRules.ElementAt(i).XPathSelectElements("./attribute-mappings/mapping[dest = '" + metaverseAttribute + "']").Count() > 1) + { + string s = ""; + } + var transformation = inboundSyncRules.ElementAt(i).XPathSelectElement("./attribute-mappings/mapping[dest = '" + metaverseAttribute + "']"); + expression = (string)transformation.Element("expression"); + srcAttribute = (string)transformation.XPathSelectElement("src/attr"); + var src = (string)transformation.XPathSelectElement("src"); + inboundExpression = !string.IsNullOrEmpty(expression) ? expression : !string.IsNullOrEmpty(srcAttribute) ? srcAttribute : src; + inboundFlowType = !string.IsNullOrEmpty(expression) ? "Expression" : "Direct"; + + var inboundSyncRuleScopingConditions = inboundSyncRules.ElementAt(i).XPathSelectElements("./synchronizationCriteria/conditions"); + var inboundSyncRuleScopingConditionsCount = inboundSyncRuleScopingConditions.Count(); + if (inboundSyncRuleScopingConditionsCount != 0) { - ++conditionIndex; - var scopes = condition.Elements("scope"); - outboundSyncRuleScopingConditionString += scopes.Select(scope => string.Format(CultureInfo.InvariantCulture, "{0} {1} {2}", (string)scope.Element("csAttribute"), (string)scope.Element("csOperator"), (string)scope.Element("csValue"))).Aggregate((i, j) => i + " AND " + j); - if (conditionIndex < outboundSyncRuleScopingConditionsCount - 1) + var conditionIndex = -1; + foreach (var condition in inboundSyncRuleScopingConditions) { - outboundSyncRuleScopingConditionString += " OR "; + ++conditionIndex; + var scopes = condition.Elements("scope"); + inboundSyncRuleScopingConditionString += scopes.Select(scope => string.Format(CultureInfo.InvariantCulture, "{0} {1} {2}", (string)scope.Element("csAttribute"), (string)scope.Element("csOperator"), (string)scope.Element("csValue"))).Aggregate((x, j) => x + "
AND
" + j); + if (conditionIndex < inboundSyncRuleScopingConditionsCount - 1) + { + inboundSyncRuleScopingConditionString += "
OR
"; + } } } } - - Documenter.AddRow(table2, new object[] { targetAttribute, source, outboundSyncRuleName, outboundSyncRuleRank, outboundSyncRuleScopingConditionString, outboundSyncRuleGuid }); - - var metaverseAttributes = new List(); - if (!string.IsNullOrEmpty(expression)) + string outboundSyncRuleName = ""; + string outboundSyncRuleGuid = ""; + string outboundConnectorGuid = ""; + string outboundConnectorName = ""; + string mappingExpression = ""; + string mappingSourceAttribute = ""; + string mappingSource = ""; + string targetAttribute = ""; + string outboundExpression = ""; + string outboundSyncRuleScopingCondition = ""; + string outboundObjectType = ""; + string outboundFlowType = ""; + + if (outboundSyncRules.ElementAtOrDefault(i) != null) { - foreach (Match match in Regex.Matches(expression, @"\[(.*?)\]")) + outboundSyncRuleName = (string)outboundSyncRules.ElementAt(i).Element("name"); + outboundSyncRuleGuid = (string)outboundSyncRules.ElementAt(i).Element("id"); + metaverseObjectType = (string)outboundSyncRules.ElementAt(i).Element("sourceObjectType"); + outboundConnectorGuid = ((string)outboundSyncRules.ElementAt(i).Element("connector") ?? string.Empty).ToUpperInvariant(); + outboundObjectType = (string)outboundSyncRules.ElementAt(i).Element("targetObjectType"); + outboundConnectorName = (string)config.XPathSelectElement(Documenter.GetConnectorXmlRootXPath(pilotConfig) + "/ma-data[translate(id, '" + Documenter.LowercaseLetters + "', '" + Documenter.UppercaseLetters + "') = '" + outboundConnectorGuid + "']/name"); + if (string.IsNullOrEmpty(outboundConnectorName)) { - metaverseAttributes.Add(match.Value.TrimStart('[').TrimEnd(']')); + Logger.Instance.WriteWarning(string.Format(CultureInfo.InvariantCulture, "Unable to dereferece connector: '{0}'. The documentation of outbound flows will be skipped for this connector. PilotConfig: '{1}'.", outboundConnectorGuid, pilotConfig)); + continue; } - } - else if (!string.IsNullOrEmpty(srcAttribute)) - { - metaverseAttributes.Add(srcAttribute); - } - - foreach (var metaverseAttribute in metaverseAttributes) - { - if (table3.Select("DataSourceAttribute = '" + targetAttribute + "' and MetaverseAttribute = '" + metaverseAttribute + "'").Count() == 0) - { - Documenter.AddRow(table3, new object[] { targetAttribute, outboundSyncRuleName, metaverseAttribute, "←" }); - // Inbound metaverse flows - var inboundSyncRules = config.XPathSelectElements(Documenter.GetSynchronizationRuleXmlRootXPath(pilotConfig) + "/synchronizationRule[targetObjectType = '" + sourceObjectType + "' and direction = 'Inbound' " + Documenter.SyncRuleDisabledCondition + " and (attribute-mappings/mapping/dest = '" + metaverseAttribute + "' or contains(attribute-mappings/mapping/expression, '[" + metaverseAttribute + "]'))]"); - inboundSyncRules = from syncRule in inboundSyncRules - let inboundSyncRulePrecedence = (int)syncRule.Element("precedence") - orderby inboundSyncRulePrecedence - select syncRule; + ++outboundSyncRuleRank; // Used only for sorting, not displayed on the report - var inboundSyncRuleRank = 0; - foreach (var inboundSyncRule in inboundSyncRules) + var outboundFlows = outboundSyncRules.ElementAt(i).XPathSelectElements("attribute-mappings/mapping[./src/attr = '" + metaverseAttribute + "' or contains(expression, '[" + metaverseAttribute + "]')]"); + foreach (var outboundFlow in outboundFlows) + { + //reset for each loop since operation is += + outboundSyncRuleScopingCondition = ""; + + mappingExpression = (string)outboundFlow.XPathSelectElement("./expression"); + mappingSourceAttribute = (string)outboundFlow.XPathSelectElement("./src/attr"); + mappingSource = (string)outboundFlow.XPathSelectElement("./src"); + targetAttribute = (string)outboundFlow.XPathSelectElement("./dest"); + outboundExpression = (string)mappingExpression ?? (string)mappingSourceAttribute ?? (string)mappingSource ?? string.Empty; + outboundFlowType = !string.IsNullOrEmpty(mappingExpression) ? "Expression" : "Direct"; + if (!string.IsNullOrEmpty(outboundExpression)) { - var inboundSyncRuleName = (string)inboundSyncRule.Element("name"); - var inboundSyncRuleGuid = (string)inboundSyncRule.Element("id"); - var inboundConnectorGuid = ((string)inboundSyncRule.Element("connector") ?? string.Empty).ToUpperInvariant(); - var inboundConnectorName = (string)config.XPathSelectElement(Documenter.GetConnectorXmlRootXPath(pilotConfig) + "/ma-data[translate(id, '" + Documenter.LowercaseLetters + "', '" + Documenter.UppercaseLetters + "') = '" + inboundConnectorGuid + "']/name"); - if (string.IsNullOrEmpty(inboundConnectorName)) - { - Logger.Instance.WriteWarning(string.Format(CultureInfo.InvariantCulture, "Unable to dereferece connector: '{0}'. The documentation of inbound flows will be skipped for this connector. PilotConfig: '{1}'.", inboundConnectorGuid, pilotConfig)); - continue; - } - - ++inboundSyncRuleRank; // Used only for sorting, not displayed on the report - - var metaverseAttributeMapping = inboundSyncRule.XPathSelectElement("attribute-mappings/mapping[dest = '" + metaverseAttribute + "' or contains(expression, '[" + metaverseAttribute + "]')]"); - var mappingExpression = (string)metaverseAttributeMapping.XPathSelectElement("./expression"); - var mappingSourceAttribute = (string)metaverseAttributeMapping.XPathSelectElement("./src/attr"); - var mappingSource = (string)metaverseAttributeMapping.XPathSelectElement("./src"); - var metaverseSource = (string)mappingExpression ?? (string)mappingSourceAttribute ?? (string)mappingSource ?? string.Empty; - if (!string.IsNullOrEmpty(metaverseSource)) + var outboundSyncRuleScopingConditions = outboundSyncRules.ElementAt(i).XPathSelectElements("./synchronizationCriteria/conditions"); + var outboundSyncRuleScopingConditionCount = outboundSyncRuleScopingConditions.Count(); + if (outboundSyncRuleScopingConditionCount != 0) { - var inboundSyncRuleScopingConditions = inboundSyncRule.XPathSelectElements("./synchronizationCriteria/conditions"); - var inboundSyncRuleScopingCondition = string.Empty; - var inboundSyncRuleScopingConditionCount = inboundSyncRuleScopingConditions.Count(); - if (inboundSyncRuleScopingConditionCount != 0) + var conditionIndex = -1; + foreach (var condition in outboundSyncRuleScopingConditions) { - var conditionIndex = -1; - foreach (var condition in inboundSyncRuleScopingConditions) + ++conditionIndex; + var scopes = condition.Elements("scope"); + outboundSyncRuleScopingCondition += scopes.Select(scope => string.Format(CultureInfo.InvariantCulture, "{0} {1} {2}", (string)scope.Element("csAttribute"), (string)scope.Element("csOperator"), (string)scope.Element("csValue"))).Aggregate((x, j) => x + "
AND
" + j); + if (conditionIndex < outboundSyncRuleScopingConditionCount - 1) { - ++conditionIndex; - var scopes = condition.Elements("scope"); - inboundSyncRuleScopingCondition += scopes.Select(scope => string.Format(CultureInfo.InvariantCulture, "{0} {1} {2}", (string)scope.Element("csAttribute"), (string)scope.Element("csOperator"), (string)scope.Element("csValue"))).Aggregate((i, j) => i + " AND " + j); - if (conditionIndex < inboundSyncRuleScopingConditionCount - 1) - { - inboundSyncRuleScopingCondition += " OR "; - } + outboundSyncRuleScopingCondition += "
OR
"; } } - - Documenter.AddRow(table4, new object[] { targetAttribute, outboundSyncRuleName, metaverseAttribute, metaverseSource, inboundSyncRuleRank, inboundSyncRuleName, inboundConnectorName, inboundSyncRuleScopingCondition, inboundConnectorGuid, inboundSyncRuleGuid }); } } + //columns and order + //inboundSyncRuleName, inboundSyncRuleScopingConditionString, inboundExpression, inboundFlowType, inboundArrow, metaverseAttribute, metaverseObjectType, outboundArrow, outboundConnectorName, outboundSyncRuleName, outboundSyncRuleScopingConditionString, outboundObjectType, outboundExpression, outboundFlowType, targetAttribute + Documenter.AddRow(table, new object[] { inboundSyncRuleName, inboundSyncRuleScopingConditionString, inboundExpression, inboundFlowType, "→", metaverseAttribute, metaverseObjectType, "→", outboundConnectorName, outboundSyncRuleName, outboundSyncRuleScopingCondition, outboundObjectType, outboundExpression, outboundFlowType, targetAttribute }); } } } @@ -2034,8 +2034,6 @@ orderby inboundSyncRulePrecedence } table.AcceptChanges(); - table2.AcceptChanges(); - table3.AcceptChanges(); } finally { @@ -2073,46 +2071,64 @@ protected DataTable GetConnectorObjectExportAttributeFlowsSummaryHeaderTable() { var headerTable = Documenter.GetHeaderTable(); - // Header Row 1 - // Export Flows - headerTable.Rows.Add(new OrderedDictionary { { "RowIndex", 0 }, { "ColumnIndex", 0 }, { "ColumnName", "Export Flows" }, { "RowSpan", 1 }, { "ColSpan", 5 }, { "ColWidth", 0 } }.Values.Cast().ToArray()); + //columns and order + //inboundSyncRuleName, inboundSyncRuleScopingConditionString, inboundExpression, inboundFlowType, inboundArrow, metaverseAttribute, metaverseObjectType, outboundArrow, outboundConnectorName, outboundSyncRuleName, outboundSyncRuleScopingConditionString, outboundObjectType, outboundFlowType, outboundExpression, targetAttribute + // Header Row 1 // Import Flows - headerTable.Rows.Add(new OrderedDictionary { { "RowIndex", 0 }, { "ColumnIndex", 1 }, { "ColumnName", "Import Flows" }, { "RowSpan", 1 }, { "ColSpan", 6 }, { "ColWidth", 0 } }.Values.Cast().ToArray()); + headerTable.Rows.Add(new OrderedDictionary { { "RowIndex", 0 }, { "ColumnIndex", 0 }, { "ColumnName", "Import Flows" }, { "RowSpan", 1 }, { "ColSpan", 5 }, { "ColWidth", 0 } }.Values.Cast().ToArray()); + + // MV Attribute + headerTable.Rows.Add(new OrderedDictionary { { "RowIndex", 0 }, { "ColumnIndex", 1 }, { "ColumnName", "Metaverse" }, { "RowSpan", 1 }, { "ColSpan", 3 }, { "ColWidth", 0 } }.Values.Cast().ToArray()); + + // Export Flows + headerTable.Rows.Add(new OrderedDictionary { { "RowIndex", 0 }, { "ColumnIndex", 2 }, { "ColumnName", "Export Flows" }, { "RowSpan", 1 }, { "ColSpan", 7 }, { "ColWidth", 0 } }.Values.Cast().ToArray()); // Header Row 2 - // DataSource Attribute - headerTable.Rows.Add(new OrderedDictionary { { "RowIndex", 1 }, { "ColumnIndex", 0 }, { "ColumnName", "CS Attribute" }, { "RowSpan", 1 }, { "ColSpan", 1 }, { "ColWidth", 10 } }.Values.Cast().ToArray()); + // Inbound Sync Rule Name + headerTable.Rows.Add(new OrderedDictionary { { "RowIndex", 1 }, { "ColumnIndex", 0 }, { "ColumnName", "Inbound Sync Rule" }, { "RowSpan", 1 }, { "ColSpan", 1 }, { "ColWidth", 10 } }.Values.Cast().ToArray()); - // Flow Direction - headerTable.Rows.Add(new OrderedDictionary { { "RowIndex", 1 }, { "ColumnIndex", 1 }, { "ColumnName", "←" }, { "RowSpan", 1 }, { "ColSpan", 1 }, { "ColWidth", 2 } }.Values.Cast().ToArray()); + // Inbound Sync Rule Scoping Condition String + headerTable.Rows.Add(new OrderedDictionary { { "RowIndex", 1 }, { "ColumnIndex", 1 }, { "ColumnName", "Inbound Sync Rule Scoping Condition" }, { "RowSpan", 1 }, { "ColSpan", 1 }, { "ColWidth", 10 } }.Values.Cast().ToArray()); - // Source - headerTable.Rows.Add(new OrderedDictionary { { "RowIndex", 1 }, { "ColumnIndex", 2 }, { "ColumnName", "Source" }, { "RowSpan", 1 }, { "ColSpan", 1 }, { "ColWidth", 10 } }.Values.Cast().ToArray()); + // Inbound Expression + headerTable.Rows.Add(new OrderedDictionary { { "RowIndex", 1 }, { "ColumnIndex", 2 }, { "ColumnName", "Inbound Expression" }, { "RowSpan", 1 }, { "ColSpan", 1 }, { "ColWidth", 10 } }.Values.Cast().ToArray()); - // Outbound Sync Rule - headerTable.Rows.Add(new OrderedDictionary { { "RowIndex", 1 }, { "ColumnIndex", 3 }, { "ColumnName", "Outbound Sync Rule" }, { "RowSpan", 1 }, { "ColSpan", 1 }, { "ColWidth", 10 } }.Values.Cast().ToArray()); + // Inbound Flow Type + headerTable.Rows.Add(new OrderedDictionary { { "RowIndex", 1 }, { "ColumnIndex", 3 }, { "ColumnName", "Inbound Flow Type" }, { "RowSpan", 1 }, { "ColSpan", 1 }, { "ColWidth", 10 } }.Values.Cast().ToArray()); - // Outbound Sync Rule Scoping Condition - headerTable.Rows.Add(new OrderedDictionary { { "RowIndex", 1 }, { "ColumnIndex", 4 }, { "ColumnName", "Outbound Sync Rule Scoping Condition" }, { "RowSpan", 1 }, { "ColSpan", 1 }, { "ColWidth", 13 } }.Values.Cast().ToArray()); + // Inbound Arrow + headerTable.Rows.Add(new OrderedDictionary { { "RowIndex", 1 }, { "ColumnIndex", 4 }, { "ColumnName", "→" }, { "RowSpan", 1 }, { "ColSpan", 1 }, { "ColWidth", 2 } }.Values.Cast().ToArray()); // Metaverse attribute - headerTable.Rows.Add(new OrderedDictionary { { "RowIndex", 1 }, { "ColumnIndex", 5 }, { "ColumnName", "Metaverse Attribute" }, { "RowSpan", 1 }, { "ColSpan", 1 }, { "ColWidth", 10 } }.Values.Cast().ToArray()); + headerTable.Rows.Add(new OrderedDictionary { { "RowIndex", 1 }, { "ColumnIndex", 5 }, { "ColumnName", "Metaverse Attribute" }, { "RowSpan", 1 }, { "ColSpan", 1 }, { "ColWidth", 8 } }.Values.Cast().ToArray()); - // Flow Direction - headerTable.Rows.Add(new OrderedDictionary { { "RowIndex", 1 }, { "ColumnIndex", 6 }, { "ColumnName", "←" }, { "RowSpan", 1 }, { "ColSpan", 1 }, { "ColWidth", 2 } }.Values.Cast().ToArray()); + // Metaverse Object Type + headerTable.Rows.Add(new OrderedDictionary { { "RowIndex", 1 }, { "ColumnIndex", 6 }, { "ColumnName", "Metaverse Object Type" }, { "RowSpan", 1 }, { "ColSpan", 1 }, { "ColWidth", 8 } }.Values.Cast().ToArray()); - // Source - headerTable.Rows.Add(new OrderedDictionary { { "RowIndex", 1 }, { "ColumnIndex", 7 }, { "ColumnName", "Source" }, { "RowSpan", 1 }, { "ColSpan", 1 }, { "ColWidth", 10 } }.Values.Cast().ToArray()); + // Outbound Arrow + headerTable.Rows.Add(new OrderedDictionary { { "RowIndex", 1 }, { "ColumnIndex", 7 }, { "ColumnName", "→" }, { "RowSpan", 1 }, { "ColSpan", 1 }, { "ColWidth", 2 } }.Values.Cast().ToArray()); - // Inbound Sync Rule - headerTable.Rows.Add(new OrderedDictionary { { "RowIndex", 1 }, { "ColumnIndex", 8 }, { "ColumnName", "Inbound Sync Rule" }, { "RowSpan", 1 }, { "ColSpan", 1 }, { "ColWidth", 10 } }.Values.Cast().ToArray()); + // Outbound Connector Name + headerTable.Rows.Add(new OrderedDictionary { { "RowIndex", 1 }, { "ColumnIndex", 8 }, { "ColumnName", "Outbound Connector" }, { "RowSpan", 1 }, { "ColSpan", 1 }, { "ColWidth", 10 } }.Values.Cast().ToArray()); - // Source Connector - headerTable.Rows.Add(new OrderedDictionary { { "RowIndex", 1 }, { "ColumnIndex", 9 }, { "ColumnName", "Source Connector" }, { "RowSpan", 1 }, { "ColSpan", 1 }, { "ColWidth", 10 } }.Values.Cast().ToArray()); + // Outbound Sync Rule Name + headerTable.Rows.Add(new OrderedDictionary { { "RowIndex", 1 }, { "ColumnIndex", 9 }, { "ColumnName", "Outbound Sync Rule" }, { "RowSpan", 1 }, { "ColSpan", 1 }, { "ColWidth", 10 } }.Values.Cast().ToArray()); - // Inbound Sync Rule Scoping Condition - headerTable.Rows.Add(new OrderedDictionary { { "RowIndex", 1 }, { "ColumnIndex", 10 }, { "ColumnName", "Inbound Sync Rule Scoping Condition" }, { "RowSpan", 1 }, { "ColSpan", 1 }, { "ColWidth", 15 } }.Values.Cast().ToArray()); + // Outbound Sync Rule Scoping Condition String + headerTable.Rows.Add(new OrderedDictionary { { "RowIndex", 1 }, { "ColumnIndex", 10 }, { "ColumnName", "Outbound Sync Rule Scoping Condition" }, { "RowSpan", 1 }, { "ColSpan", 1 }, { "ColWidth", 10 } }.Values.Cast().ToArray()); + + // Outbound Object Type + headerTable.Rows.Add(new OrderedDictionary { { "RowIndex", 1 }, { "ColumnIndex", 11 }, { "ColumnName", "Outbound Object Type" }, { "RowSpan", 1 }, { "ColSpan", 1 }, { "ColWidth", 10 } }.Values.Cast().ToArray()); + + // Outbound Flow Type + headerTable.Rows.Add(new OrderedDictionary { { "RowIndex", 1 }, { "ColumnIndex", 12 }, { "ColumnName", "Outbound Flow Type" }, { "RowSpan", 1 }, { "ColSpan", 1 }, { "ColWidth", 10 } }.Values.Cast().ToArray()); + + // Outbound Expression + headerTable.Rows.Add(new OrderedDictionary { { "RowIndex", 1 }, { "ColumnIndex", 13 }, { "ColumnName", "Outbound Expression" }, { "RowSpan", 1 }, { "ColSpan", 1 }, { "ColWidth", 10 } }.Values.Cast().ToArray()); + + // Target Attribute + headerTable.Rows.Add(new OrderedDictionary { { "RowIndex", 1 }, { "ColumnIndex", 14 }, { "ColumnName", "Target Attribute" }, { "RowSpan", 1 }, { "ColSpan", 1 }, { "ColWidth", 10 } }.Values.Cast().ToArray()); headerTable.AcceptChanges(); From e7d2c72b7bb97af92600aa389638d1b28ef5613f Mon Sep 17 00:00:00 2001 From: FIMTooler Date: Tue, 14 Nov 2023 17:11:52 -0500 Subject: [PATCH 02/10] Fixed column order of outboundExpression and outboundFlowType Renamed dataset table for ConnectorObjectImportAttributeFlowsSummaryDataSets to add 'customized' prefix --- .../ConnectorDocumenter.cs | 24 +++++++++---------- 1 file changed, 12 insertions(+), 12 deletions(-) diff --git a/src/AzureADConnectSyncDocumenter/ConnectorDocumenter.cs b/src/AzureADConnectSyncDocumenter/ConnectorDocumenter.cs index d8bb0d1..b9ce599 100644 --- a/src/AzureADConnectSyncDocumenter/ConnectorDocumenter.cs +++ b/src/AzureADConnectSyncDocumenter/ConnectorDocumenter.cs @@ -1252,10 +1252,10 @@ protected void CreateConnectorObjectImportAttributeFlowsSummaryDataSets() { Logger.Instance.WriteMethodEntry(); //columns and order - //inboundSyncRuleName, inboundSyncRuleScopingConditionString, inboundExpression, inboundFlowType, inboundArrow, metaverseAttribute, metaverseObjectType, outboundArrow, outboundConnectorName, outboundSyncRuleName, outboundSyncRuleScopingConditionString, outboundObjectType, outboundExpression, outboundFlowType, targetAttribute + //inboundSyncRuleName, inboundSyncRuleScopingConditionString, inboundExpression, inboundFlowType, inboundArrow, metaverseAttribute, metaverseObjectType, outboundArrow, outboundConnectorName, outboundSyncRuleName, outboundSyncRuleScopingConditionString, outboundObjectType, outboundFlowType, outboundExpression, targetAttribute try { - var table = new DataTable("ImportSummary") { Locale = CultureInfo.InvariantCulture }; + var table = new DataTable("customizedImportSummary") { Locale = CultureInfo.InvariantCulture }; var column1 = new DataColumn("inboundSyncRuleName"); var column2 = new DataColumn("inboundSyncRuleScopingConditionString"); var column3 = new DataColumn("inboundExpression"); @@ -1268,8 +1268,8 @@ protected void CreateConnectorObjectImportAttributeFlowsSummaryDataSets() var column10 = new DataColumn("outboundSyncRuleName"); var column11 = new DataColumn("outboundSyncRuleScopingConditionString"); var column12 = new DataColumn("outboundObjectType"); - var column13 = new DataColumn("outboundExpression"); - var column14 = new DataColumn("outboundFlowType"); + var column13 = new DataColumn("outboundFlowType"); + var column14 = new DataColumn("outboundExpression"); var column15 = new DataColumn("targetAttribute"); table.Columns.Add(column1); @@ -1315,7 +1315,7 @@ protected DataTable GetConnectorObjectImportAttributeFlowsSummaryPrintTable() { var printTable = Documenter.GetPrintTable(); //columns and order - //inboundSyncRuleName, inboundSyncRuleScopingConditionString, inboundExpression, inboundFlowType, inboundArrow, metaverseAttribute, metaverseObjectType, outboundArrow, outboundConnectorName, outboundSyncRuleName, outboundSyncRuleScopingConditionString, outboundObjectType, outboundExpression, outboundFlowType,targetAttribute + //inboundSyncRuleName, inboundSyncRuleScopingConditionString, inboundExpression, inboundFlowType, inboundArrow, metaverseAttribute, metaverseObjectType, outboundArrow, outboundConnectorName, outboundSyncRuleName, outboundSyncRuleScopingConditionString, outboundObjectType, outboundFlowType, outboundExpression, targetAttribute // Inbound Sync Rule Name printTable.Rows.Add(new OrderedDictionary { { "TableIndex", 0 }, { "ColumnIndex", 0 }, { "Hidden", false }, { "SortOrder", -1 }, { "BookmarkIndex", -1 }, { "JumpToBookmarkIndex", 5 }, { "ChangeIgnored", false } }.Values.Cast().ToArray()); @@ -1353,11 +1353,11 @@ protected DataTable GetConnectorObjectImportAttributeFlowsSummaryPrintTable() // Outbound Object Type printTable.Rows.Add(new OrderedDictionary { { "TableIndex", 0 }, { "ColumnIndex", 11 }, { "Hidden", false }, { "SortOrder", -1 }, { "BookmarkIndex", -1 }, { "JumpToBookmarkIndex", -1 }, { "ChangeIgnored", false } }.Values.Cast().ToArray()); - // Outbound Expression - printTable.Rows.Add(new OrderedDictionary { { "TableIndex", 0 }, { "ColumnIndex", 12 }, { "Hidden", false }, { "SortOrder", -1 }, { "BookmarkIndex", -1 }, { "JumpToBookmarkIndex", -1 }, { "ChangeIgnored", false } }.Values.Cast().ToArray()); - // Outbound Flow Type - printTable.Rows.Add(new OrderedDictionary { { "TableIndex", 0 }, { "ColumnIndex", 13 }, { "Hidden", false }, { "SortOrder", -1 }, { "BookmarkIndex", -1 }, { "JumpToBookmarkIndex", -1 }, { "ChangeIgnored", true } }.Values.Cast().ToArray()); + printTable.Rows.Add(new OrderedDictionary { { "TableIndex", 0 }, { "ColumnIndex", 12 }, { "Hidden", false }, { "SortOrder", -1 }, { "BookmarkIndex", -1 }, { "JumpToBookmarkIndex", -1 }, { "ChangeIgnored", true } }.Values.Cast().ToArray()); + + // Outbound Expression + printTable.Rows.Add(new OrderedDictionary { { "TableIndex", 0 }, { "ColumnIndex", 13 }, { "Hidden", false }, { "SortOrder", -1 }, { "BookmarkIndex", -1 }, { "JumpToBookmarkIndex", -1 }, { "ChangeIgnored", false } }.Values.Cast().ToArray()); // Target Attribute printTable.Rows.Add(new OrderedDictionary { { "TableIndex", 0 }, { "ColumnIndex", 14 }, { "Hidden", false }, { "SortOrder", -1 }, { "BookmarkIndex", -1 }, { "JumpToBookmarkIndex", -1 }, { "ChangeIgnored", false } }.Values.Cast().ToArray()); @@ -1379,7 +1379,7 @@ protected DataTable GetConnectorObjectImportAttributeFlowsSummaryPrintTable() protected void FillConnectorObjectImportAttributeFlowsSummary(bool pilotConfig) { //columns and order - //inboundSyncRuleName, inboundSyncRuleScopingConditionString, inboundExpression, inboundFlowType, inboundArrow, metaverseAttribute, metaverseObjectType, outboundArrow, outboundConnectorName, outboundSyncRuleName, outboundSyncRuleScopingConditionString, outboundObjectType, outboundExpression, outboundFlowType, targetAttribute + //inboundSyncRuleName, inboundSyncRuleScopingConditionString, inboundExpression, inboundFlowType, inboundArrow, metaverseAttribute, metaverseObjectType, outboundArrow, outboundConnectorName, outboundSyncRuleName, outboundSyncRuleScopingConditionString, outboundObjectType, outboundFlowType, outboundExpression, targetAttribute Logger.Instance.WriteMethodEntry("Pilot Config: '{0}'.", pilotConfig); try @@ -1544,8 +1544,8 @@ orderby outboundSyncRulePrecedence } } //columns and order - //inboundSyncRuleName, inboundSyncRuleScopingConditionString, inboundExpression, inboundFlowType, inboundArrow, metaverseAttribute, metaverseObjectType, outboundArrow, outboundConnectorName, outboundSyncRuleName, outboundSyncRuleScopingConditionString, outboundObjectType, outboundExpression, outboundFlowType, targetAttribute - Documenter.AddRow(table, new object[] { inboundSyncRuleName, inboundSyncRuleScopingConditionString, inboundExpression, inboundFlowType, "→", metaverseAttribute, metaverseObjectType, "→", outboundConnectorName, outboundSyncRuleName, outboundSyncRuleScopingCondition, outboundObjectType, outboundExpression, outboundFlowType, targetAttribute }); + //inboundSyncRuleName, inboundSyncRuleScopingConditionString, inboundExpression, inboundFlowType, inboundArrow, metaverseAttribute, metaverseObjectType, outboundArrow, outboundConnectorName, outboundSyncRuleName, outboundSyncRuleScopingConditionString, outboundObjectType, outboundFlowType, outboundExpression, targetAttribute + Documenter.AddRow(table, new object[] { inboundSyncRuleName, inboundSyncRuleScopingConditionString, inboundExpression, inboundFlowType, "→", metaverseAttribute, metaverseObjectType, "→", outboundConnectorName, outboundSyncRuleName, outboundSyncRuleScopingCondition, outboundObjectType, outboundFlowType, outboundExpression, targetAttribute }); } } } From 7ac2d8628510c754e65b2a6f0b9a83d20a6b9e5e Mon Sep 17 00:00:00 2001 From: FIMTooler Date: Tue, 14 Nov 2023 17:34:26 -0500 Subject: [PATCH 03/10] Rebuilt Metaverse Object Types table for readability and comprehension --- .../MetaverseDocumenter.cs | 304 +++++++----------- 1 file changed, 111 insertions(+), 193 deletions(-) diff --git a/src/AzureADConnectSyncDocumenter/MetaverseDocumenter.cs b/src/AzureADConnectSyncDocumenter/MetaverseDocumenter.cs index 8aec29e..31d3166 100644 --- a/src/AzureADConnectSyncDocumenter/MetaverseDocumenter.cs +++ b/src/AzureADConnectSyncDocumenter/MetaverseDocumenter.cs @@ -198,76 +198,36 @@ private void ProcessMetaverseObjectType() private void CreateMetaverseObjectTypeDataSets() { Logger.Instance.WriteMethodEntry(); - + //columns and order + //Precedence, Connector, InboundSyncRule, inboundFlowType, Source, inboundSyncRuleScopingConditionString, Attribute, Type, Multivalued, Indexed try { - var table = new DataTable("MetaverseObjectType") { Locale = CultureInfo.InvariantCulture }; - - var column1 = new DataColumn("Attribute"); - var column2 = new DataColumn("Type"); - var column3 = new DataColumn("Multi-valued"); - var column4 = new DataColumn("Indexed"); + var table = new DataTable("customizedMetaverseObjectType") { Locale = CultureInfo.InvariantCulture }; + var column1 = new DataColumn("Precedence", typeof(int)); + var column2 = new DataColumn("Connector"); + var column3= new DataColumn("InboundSyncRule"); + var column4 = new DataColumn("inboundFlowType"); + var column5 = new DataColumn("Source"); + var column6 = new DataColumn("inboundSyncRuleScopingConditionString"); + var column7 = new DataColumn("metaverseAttribute"); + var column8 = new DataColumn("metaverseObjectType"); + var column9 = new DataColumn("Multivalued"); + var column10 = new DataColumn("Indexed"); table.Columns.Add(column1); table.Columns.Add(column2); table.Columns.Add(column3); table.Columns.Add(column4); - table.PrimaryKey = new[] { column1 }; - - var table2 = new DataTable("MetaverseObjectTypePrecedence") { Locale = CultureInfo.InvariantCulture }; - - var column12 = new DataColumn("Attribute"); - var column22 = new DataColumn("Precedence", typeof(int)); - var column32 = new DataColumn("Connector"); - var column42 = new DataColumn("Inbound Sync Rule"); - var column52 = new DataColumn("Source"); - var column62 = new DataColumn("ConnectorGuid"); - var column72 = new DataColumn("SyncRuleGuid"); - - table2.Columns.Add(column12); - table2.Columns.Add(column22); - table2.Columns.Add(column32); - table2.Columns.Add(column42); - table2.Columns.Add(column52); - table2.Columns.Add(column62); - table2.Columns.Add(column72); - table2.PrimaryKey = new[] { column12, column32, column42 }; - - var table3 = new DataTable("SyncRuleScopingCondition") { Locale = CultureInfo.InvariantCulture }; - - var column13 = new DataColumn("Attribute"); - var column23 = new DataColumn("Connector"); - var column33 = new DataColumn("Inbound Sync Rule"); - var column43 = new DataColumn("Group#"); - var column53 = new DataColumn("Scope#"); - var column63 = new DataColumn("CS Attribute"); - var column73 = new DataColumn("Operator"); - var column83 = new DataColumn("Value"); - var column93 = new DataColumn("ConnectorGuid"); - var column103 = new DataColumn("SyncRuleGuid"); - - table3.Columns.Add(column13); - table3.Columns.Add(column23); - table3.Columns.Add(column33); - table3.Columns.Add(column43); - table3.Columns.Add(column53); - table3.Columns.Add(column63); - table3.Columns.Add(column73); - table3.Columns.Add(column83); - table3.Columns.Add(column93); - table3.Columns.Add(column103); - table3.PrimaryKey = new[] { column13, column23, column33, column43, column53, column63, column73 }; + table.Columns.Add(column5); + table.Columns.Add(column6); + table.Columns.Add(column7); + table.Columns.Add(column8); + table.Columns.Add(column9); + table.Columns.Add(column10); + table.PrimaryKey = new[] { column1, column2, column3, column4, column5, column6, column7, column8, column9, column10 }; this.PilotDataSet = new DataSet("MetaverseObjectType") { Locale = CultureInfo.InvariantCulture }; this.PilotDataSet.Tables.Add(table); - this.PilotDataSet.Tables.Add(table2); - this.PilotDataSet.Tables.Add(table3); - - var dataRelation12 = new DataRelation("DataRelation12", new[] { column1 }, new[] { column12 }, false); - var dataRelation23 = new DataRelation("DataRelation23", new[] { column12, column32, column42 }, new[] { column13, column23, column33 }, false); - - this.PilotDataSet.Relations.Add(dataRelation12); - this.PilotDataSet.Relations.Add(dataRelation23); this.ProductionDataSet = this.PilotDataSet.Clone(); @@ -292,72 +252,39 @@ private DataTable GetMetaverseObjectTypePrintTable() try { var printTable = Documenter.GetPrintTable(); + //columns and order + //Precedence, Connector, InboundSyncRule, inboundFlowType, Source, inboundSyncRuleScopingConditionString, metaverseAttribute, metaverseObjectType, Multivalued, Indexed // Table 1 - // Attribute - printTable.Rows.Add(new OrderedDictionary { { "TableIndex", 0 }, { "ColumnIndex", 0 }, { "Hidden", false }, { "SortOrder", 0 }, { "BookmarkIndex", -1 }, { "JumpToBookmarkIndex", -1 }, { "ChangeIgnored", false } }.Values.Cast().ToArray()); - - // Type - printTable.Rows.Add(new OrderedDictionary { { "TableIndex", 0 }, { "ColumnIndex", 1 }, { "Hidden", false }, { "SortOrder", -1 }, { "BookmarkIndex", -1 }, { "JumpToBookmarkIndex", -1 }, { "ChangeIgnored", false } }.Values.Cast().ToArray()); - - // Multi-valued - printTable.Rows.Add(new OrderedDictionary { { "TableIndex", 0 }, { "ColumnIndex", 2 }, { "Hidden", false }, { "SortOrder", -1 }, { "BookmarkIndex", -1 }, { "JumpToBookmarkIndex", -1 }, { "ChangeIgnored", false } }.Values.Cast().ToArray()); - - // Indexed - printTable.Rows.Add(new OrderedDictionary { { "TableIndex", 0 }, { "ColumnIndex", 3 }, { "Hidden", false }, { "SortOrder", -1 }, { "BookmarkIndex", -1 }, { "JumpToBookmarkIndex", -1 }, { "ChangeIgnored", false } }.Values.Cast().ToArray()); - - // Table 2 - // Attribute - printTable.Rows.Add(new OrderedDictionary { { "TableIndex", 1 }, { "ColumnIndex", 0 }, { "Hidden", true }, { "SortOrder", 0 }, { "BookmarkIndex", -1 }, { "JumpToBookmarkIndex", -1 }, { "ChangeIgnored", false } }.Values.Cast().ToArray()); - // Precedence - printTable.Rows.Add(new OrderedDictionary { { "TableIndex", 1 }, { "ColumnIndex", 1 }, { "Hidden", false }, { "SortOrder", 1 }, { "BookmarkIndex", -1 }, { "JumpToBookmarkIndex", -1 }, { "ChangeIgnored", false } }.Values.Cast().ToArray()); + printTable.Rows.Add(new OrderedDictionary { { "TableIndex", 0 }, { "ColumnIndex", 0 }, { "Hidden", false }, { "SortOrder", 1 }, { "BookmarkIndex", -1 }, { "JumpToBookmarkIndex", -1 }, { "ChangeIgnored", false } }.Values.Cast().ToArray()); // Connector - printTable.Rows.Add(new OrderedDictionary { { "TableIndex", 1 }, { "ColumnIndex", 2 }, { "Hidden", false }, { "SortOrder", -1 }, { "BookmarkIndex", -1 }, { "JumpToBookmarkIndex", 5 }, { "ChangeIgnored", false } }.Values.Cast().ToArray()); + printTable.Rows.Add(new OrderedDictionary { { "TableIndex", 0 }, { "ColumnIndex", 1 }, { "Hidden", false }, { "SortOrder", -1 }, { "BookmarkIndex", -1 }, { "JumpToBookmarkIndex", 5 }, { "ChangeIgnored", false } }.Values.Cast().ToArray()); - // Inbound Sync Rule - printTable.Rows.Add(new OrderedDictionary { { "TableIndex", 1 }, { "ColumnIndex", 3 }, { "Hidden", false }, { "SortOrder", -1 }, { "BookmarkIndex", -1 }, { "JumpToBookmarkIndex", 6 }, { "ChangeIgnored", false } }.Values.Cast().ToArray()); + // InboundSyncRule + printTable.Rows.Add(new OrderedDictionary { { "TableIndex", 0 }, { "ColumnIndex", 2 }, { "Hidden", false }, { "SortOrder", -1 }, { "BookmarkIndex", -1 }, { "JumpToBookmarkIndex", 6 }, { "ChangeIgnored", false } }.Values.Cast().ToArray()); - // Source - printTable.Rows.Add(new OrderedDictionary { { "TableIndex", 1 }, { "ColumnIndex", 4 }, { "Hidden", false }, { "SortOrder", -1 }, { "BookmarkIndex", -1 }, { "JumpToBookmarkIndex", -1 }, { "ChangeIgnored", false } }.Values.Cast().ToArray()); - - // ConnectorGuid - printTable.Rows.Add(new OrderedDictionary { { "TableIndex", 1 }, { "ColumnIndex", 5 }, { "Hidden", true }, { "SortOrder", -1 }, { "BookmarkIndex", -1 }, { "JumpToBookmarkIndex", -1 }, { "ChangeIgnored", true } }.Values.Cast().ToArray()); - - // SyncRuleGuid - printTable.Rows.Add(new OrderedDictionary { { "TableIndex", 1 }, { "ColumnIndex", 6 }, { "Hidden", true }, { "SortOrder", -1 }, { "BookmarkIndex", -1 }, { "JumpToBookmarkIndex", -1 }, { "ChangeIgnored", true } }.Values.Cast().ToArray()); - - // Table 3 - // Attribute - printTable.Rows.Add(new OrderedDictionary { { "TableIndex", 2 }, { "ColumnIndex", 0 }, { "Hidden", true }, { "SortOrder", 0 }, { "BookmarkIndex", -1 }, { "JumpToBookmarkIndex", -1 }, { "ChangeIgnored", false } }.Values.Cast().ToArray()); - - // Connector - printTable.Rows.Add(new OrderedDictionary { { "TableIndex", 2 }, { "ColumnIndex", 1 }, { "Hidden", true }, { "SortOrder", 1 }, { "BookmarkIndex", -1 }, { "JumpToBookmarkIndex", -1 }, { "ChangeIgnored", false } }.Values.Cast().ToArray()); - - // Inbound Sync Rule - printTable.Rows.Add(new OrderedDictionary { { "TableIndex", 2 }, { "ColumnIndex", 2 }, { "Hidden", true }, { "SortOrder", 2 }, { "BookmarkIndex", -1 }, { "JumpToBookmarkIndex", -1 }, { "ChangeIgnored", false } }.Values.Cast().ToArray()); - - // Group# - printTable.Rows.Add(new OrderedDictionary { { "TableIndex", 2 }, { "ColumnIndex", 3 }, { "Hidden", true }, { "SortOrder", 3 }, { "BookmarkIndex", -1 }, { "JumpToBookmarkIndex", -1 }, { "ChangeIgnored", false } }.Values.Cast().ToArray()); + // inboundFlowType + printTable.Rows.Add(new OrderedDictionary { { "TableIndex", 0 }, { "ColumnIndex", 3 }, { "Hidden", false }, { "SortOrder", -1 }, { "BookmarkIndex", -1 }, { "JumpToBookmarkIndex", -1 }, { "ChangeIgnored", false } }.Values.Cast().ToArray()); - // Scope# - printTable.Rows.Add(new OrderedDictionary { { "TableIndex", 2 }, { "ColumnIndex", 4 }, { "Hidden", true }, { "SortOrder", 4 }, { "BookmarkIndex", -1 }, { "JumpToBookmarkIndex", -1 }, { "ChangeIgnored", false } }.Values.Cast().ToArray()); + // Source + printTable.Rows.Add(new OrderedDictionary { { "TableIndex", 0 }, { "ColumnIndex", 4 }, { "Hidden", false }, { "SortOrder", -1 }, { "BookmarkIndex", -1 }, { "JumpToBookmarkIndex", -1 }, { "ChangeIgnored", false } }.Values.Cast().ToArray()); - // CS Attribute - printTable.Rows.Add(new OrderedDictionary { { "TableIndex", 2 }, { "ColumnIndex", 5 }, { "Hidden", false }, { "SortOrder", -1 }, { "BookmarkIndex", -1 }, { "JumpToBookmarkIndex", -1 }, { "ChangeIgnored", false } }.Values.Cast().ToArray()); + // inboundSyncRuleScopingConditionString + printTable.Rows.Add(new OrderedDictionary { { "TableIndex", 0 }, { "ColumnIndex", 5 }, { "Hidden", false }, { "SortOrder", -1 }, { "BookmarkIndex", -1 }, { "JumpToBookmarkIndex", -1 }, { "ChangeIgnored", false } }.Values.Cast().ToArray()); - // Operator - printTable.Rows.Add(new OrderedDictionary { { "TableIndex", 2 }, { "ColumnIndex", 6 }, { "Hidden", false }, { "SortOrder", -1 }, { "BookmarkIndex", -1 }, { "JumpToBookmarkIndex", -1 }, { "ChangeIgnored", false } }.Values.Cast().ToArray()); + // metaverseAttribute + printTable.Rows.Add(new OrderedDictionary { { "TableIndex", 0 }, { "ColumnIndex", 6 }, { "Hidden", false }, { "SortOrder", 0 }, { "BookmarkIndex", -1 }, { "JumpToBookmarkIndex", -1 }, { "ChangeIgnored", false } }.Values.Cast().ToArray()); - // Value - printTable.Rows.Add(new OrderedDictionary { { "TableIndex", 2 }, { "ColumnIndex", 7 }, { "Hidden", false }, { "SortOrder", -1 }, { "BookmarkIndex", -1 }, { "JumpToBookmarkIndex", -1 }, { "ChangeIgnored", false } }.Values.Cast().ToArray()); + // metaverseObjectType + printTable.Rows.Add(new OrderedDictionary { { "TableIndex", 0 }, { "ColumnIndex", 7 }, { "Hidden", false }, { "SortOrder", -1 }, { "BookmarkIndex", -1 }, { "JumpToBookmarkIndex", -1 }, { "ChangeIgnored", false } }.Values.Cast().ToArray()); - // ConnectorGuid - printTable.Rows.Add(new OrderedDictionary { { "TableIndex", 2 }, { "ColumnIndex", 8 }, { "Hidden", true }, { "SortOrder", -1 }, { "BookmarkIndex", -1 }, { "JumpToBookmarkIndex", -1 }, { "ChangeIgnored", true } }.Values.Cast().ToArray()); + // Multi-valued + printTable.Rows.Add(new OrderedDictionary { { "TableIndex", 0 }, { "ColumnIndex", 8 }, { "Hidden", false }, { "SortOrder", -1 }, { "BookmarkIndex", -1 }, { "JumpToBookmarkIndex", -1 }, { "ChangeIgnored", false } }.Values.Cast().ToArray()); - // SyncRuleGuid - printTable.Rows.Add(new OrderedDictionary { { "TableIndex", 2 }, { "ColumnIndex", 9 }, { "Hidden", true }, { "SortOrder", -1 }, { "BookmarkIndex", -1 }, { "JumpToBookmarkIndex", -1 }, { "ChangeIgnored", true } }.Values.Cast().ToArray()); + // Indexed + printTable.Rows.Add(new OrderedDictionary { { "TableIndex", 0 }, { "ColumnIndex", 9 }, { "Hidden", false }, { "SortOrder", -1 }, { "BookmarkIndex", -1 }, { "JumpToBookmarkIndex", -1 }, { "ChangeIgnored", false } }.Values.Cast().ToArray()); printTable.AcceptChanges(); @@ -383,8 +310,6 @@ private void FillMetaverseObjectTypeDataSet(bool pilotConfig) var dataSet = pilotConfig ? this.PilotDataSet : this.ProductionDataSet; var table = dataSet.Tables[0]; - var table2 = dataSet.Tables[1]; - var table3 = dataSet.Tables[2]; var attributes = config.XPathSelectElements(Documenter.GetMetaverseXmlRootXPath(pilotConfig) + "/mv-data//dsml:class[dsml:name = '" + this.currentObjectType + "' ]/dsml:attribute", Documenter.NamespaceManager); @@ -394,33 +319,33 @@ private void FillMetaverseObjectTypeDataSet(bool pilotConfig) orderby name select attribute; var attributeIndex = -1; + + string metaverseObjectType = this.currentObjectType; + foreach (var attribute in attributes) { ++attributeIndex; - var attributeName = ((string)attribute.Attribute("ref") ?? string.Empty).Trim('#'); + var metaverseAttribute = ((string)attribute.Attribute("ref") ?? string.Empty).Trim('#'); // Set Logger call context items - Logger.SetContextItem(MetaverseDocumenter.LoggerContextItemMetaverseAttribute, attributeName); + Logger.SetContextItem(MetaverseDocumenter.LoggerContextItemMetaverseAttribute, metaverseAttribute); Logger.Instance.WriteInfo("Processing Attribute Information."); - var attributeInfo = config.XPathSelectElement(Documenter.GetMetaverseXmlRootXPath(pilotConfig) + "/mv-data//dsml:attribute-type[dsml:name = '" + attributeName + "']", Documenter.NamespaceManager); + var attributeInfo = config.XPathSelectElement(Documenter.GetMetaverseXmlRootXPath(pilotConfig) + "/mv-data//dsml:attribute-type[dsml:name = '" + metaverseAttribute + "']", Documenter.NamespaceManager); var attributeSyntax = (string)attributeInfo.Element(Documenter.DsmlNamespace + "syntax"); var row = table.NewRow(); - row[0] = attributeName; - row[1] = Documenter.GetAttributeType(attributeSyntax, (string)attributeInfo.Attribute(Documenter.MmsDsmlNamespace + "indexable")); - row[2] = ((string)attributeInfo.Attribute("single-value") ?? string.Empty).Equals("true", StringComparison.OrdinalIgnoreCase) ? "No" : "Yes"; - row[3] = ((string)attributeInfo.Attribute(Documenter.MmsDsmlNamespace + "indexed") ?? string.Empty).Equals("true", StringComparison.OrdinalIgnoreCase) ? "Yes" : "No"; - - Documenter.AddRow(table, row); + string type = Documenter.GetAttributeType(attributeSyntax, (string)attributeInfo.Attribute(Documenter.MmsDsmlNamespace + "indexable")); + string singleValue = ((string)attributeInfo.Attribute("single-value") ?? string.Empty).Equals("true", StringComparison.OrdinalIgnoreCase) ? "No" : "Yes"; + string indexed = ((string)attributeInfo.Attribute(Documenter.MmsDsmlNamespace + "indexed") ?? string.Empty).Equals("true", StringComparison.OrdinalIgnoreCase) ? "Yes" : "No"; Logger.Instance.WriteVerbose("Processed Attribute Information."); // Fetch Sync Rules - var syncRules = config.XPathSelectElements(Documenter.GetSynchronizationRuleXmlRootXPath(pilotConfig) + "/synchronizationRule[targetObjectType = '" + this.currentObjectType + "' and direction = 'Inbound' " + Documenter.SyncRuleDisabledCondition + " and attribute-mappings/mapping/dest = '" + attributeName + "']"); + var syncRules = config.XPathSelectElements(Documenter.GetSynchronizationRuleXmlRootXPath(pilotConfig) + "/synchronizationRule[targetObjectType = '" + this.currentObjectType + "' and direction = 'Inbound' " + Documenter.SyncRuleDisabledCondition + " and attribute-mappings/mapping/dest = '" + metaverseAttribute + "']"); syncRules = from syncRule in syncRules let precedence = (int)syncRule.Element("precedence") orderby precedence @@ -429,10 +354,9 @@ orderby precedence var syncRuleIndex = -1; foreach (var syncRule in syncRules) { + string inboundSyncRuleScopingConditionString = ""; ++syncRuleIndex; - var row2 = table2.NewRow(); - row2[0] = attributeName; - row2[1] = syncRuleIndex + 1; // Care only about the precedence relative rank here than actual value + int rank = syncRuleIndex + 1; // Care only about the precedence relative rank here than actual value var connector = ((string)syncRule.Element("connector") ?? string.Empty).ToUpperInvariant(); var connectorName = (string)config.XPathSelectElement(Documenter.GetConnectorXmlRootXPath(pilotConfig) + "/ma-data[translate(id, '" + Documenter.LowercaseLetters + "', '" + Documenter.UppercaseLetters + "') = '" + connector + "']/name"); @@ -442,61 +366,51 @@ orderby precedence continue; } - var syncRuleName = (string)syncRule.Element("name"); - row2[2] = connectorName; - row2[3] = syncRuleName; - - Logger.Instance.WriteVerbose("Processing Sync Rule Info for Connector: '{0}'. Sync Rule: '{1}'.", connectorName, syncRuleName); + var inboundSyncRuleName = (string)syncRule.Element("name"); - var mappingExpression = syncRule.XPathSelectElement("attribute-mappings/mapping[dest = '" + attributeName + "']/expression"); - var mappingSourceAttribute = syncRule.XPathSelectElement("attribute-mappings/mapping[dest = '" + attributeName + "']/src/attr"); - var mappingSource = syncRule.XPathSelectElement("attribute-mappings/mapping[dest = '" + attributeName + "']/src"); + Logger.Instance.WriteVerbose("Processing Sync Rule Info for Connector: '{0}'. Sync Rule: '{1}'.", connectorName, inboundSyncRuleName); - row2[4] = (string)mappingExpression ?? (string)mappingSourceAttribute ?? (string)mappingSource ?? "??"; - row2[5] = connector; - row2[6] = (string)syncRule.Element("id"); + var mappingExpression = (string)syncRule.XPathSelectElement("attribute-mappings/mapping[dest = '" + metaverseAttribute + "']/expression"); + var mappingSourceAttribute = (string)syncRule.XPathSelectElement("attribute-mappings/mapping[dest = '" + metaverseAttribute + "']/src/attr"); + var mappingSource = (string)syncRule.XPathSelectElement("attribute-mappings/mapping[dest = '" + metaverseAttribute + "']/src"); + string inboundExpression = (string)mappingExpression ?? (string)mappingSourceAttribute ?? (string)mappingSource ?? "??"; + string inboundFlowType = !string.IsNullOrEmpty(mappingExpression) ? "Expression" : "Direct"; - Documenter.AddRow(table2, row2); - Logger.Instance.WriteVerbose("Processed Sync Rule Info for Connector: '{0}'. Sync Rule: '{1}'.", connectorName, syncRuleName); + Logger.Instance.WriteVerbose("Processed Sync Rule Info for Connector: '{0}'. Sync Rule: '{1}'.", connectorName, inboundSyncRuleName); // Fetch Sync Rule Scoping Conditions - var conditions = syncRule.XPathSelectElements("synchronizationCriteria/conditions"); + var inboundSyncRuleScopingConditions = syncRule.XPathSelectElements("./synchronizationCriteria/conditions"); + var inboundSyncRuleScopingConditionCount = inboundSyncRuleScopingConditions.Count(); var conditionIndex = -1; - foreach (var condition in conditions) + foreach (var condition in inboundSyncRuleScopingConditions) { ++conditionIndex; - - Logger.Instance.WriteVerbose("Processing Sync Rule Scope for Connector: '{0}'. Sync Rule: '{1}'.", connectorName, syncRuleName); + Logger.Instance.WriteVerbose("Processing Sync Rule Scope for Connector: '{0}'. Sync Rule: '{1}'.", connectorName, inboundSyncRuleName); var scopes = condition.Elements("scope"); - var scopeIndex = -1; - foreach (var scope in scopes) + // Putting all scopes into inboundSyncRuleScopingConditionString for single row in table + //foreach (var scope in scopes) + //{ + // string csAttribute = (string)scope.Element("csAttribute"); + // string csOperator = (string)scope.Element("csOperator"); + // string csValue = (string)scope.Element("csValue"); + //} + inboundSyncRuleScopingConditionString += scopes.Select(scope => string.Format(CultureInfo.InvariantCulture, "{0} {1} {2}", (string)scope.Element("csAttribute"), (string)scope.Element("csOperator"), (string)scope.Element("csValue"))).Aggregate((x, j) => x + "
AND
" + j); + if (conditionIndex < inboundSyncRuleScopingConditionCount - 1) { - ++scopeIndex; - var row3 = table3.NewRow(); - row3[0] = attributeName; - row3[1] = connectorName; - row3[2] = syncRuleName; - row3[3] = conditionIndex; - row3[4] = scopeIndex; - row3[5] = (string)scope.Element("csAttribute"); - row3[6] = (string)scope.Element("csOperator"); - row3[7] = (string)scope.Element("csValue"); - row3[8] = connector; - row3[9] = (string)syncRule.Element("id"); - - Documenter.AddRow(table3, row3); + inboundSyncRuleScopingConditionString += "
OR
"; } - Logger.Instance.WriteVerbose("Processed Sync Rule Scope for Connector: '{0}'. Sync Rule: '{1}'.", connectorName, syncRuleName); + Logger.Instance.WriteVerbose("Processed Sync Rule Scope for Connector: '{0}'. Sync Rule: '{1}'.", connectorName, inboundSyncRuleName); } + //columns and order + //Precedence, Connector, InboundSyncRule, inboundFlowType, Source, inboundSyncRuleScopingConditionString, metaverseAttribute, metaverseObjectType, Multivalued, Indexed + Documenter.AddRow(table, new object[] { rank, connectorName, inboundSyncRuleName, inboundFlowType, inboundExpression, inboundSyncRuleScopingConditionString, metaverseAttribute, metaverseObjectType, singleValue, indexed }); } } table.AcceptChanges(); - table2.AcceptChanges(); - table3.AcceptChanges(); } finally { @@ -536,48 +450,52 @@ private DataTable GetMetaverseObjectTypeHeaderTable() try { var headerTable = Documenter.GetHeaderTable(); + //columns and order + //Precedence, Connector, InboundSyncRule, inboundFlowType, Source, inboundSyncRuleScopingConditionString, metaverseAttribute, metaverseObjectType, Multivalued, Indexed + + // Column widths need to match the column order left to right of the final table view. Not specific to column name + // Updated column order + // Rank 4 + // Connector 10 + // Inbound Sync Rule 10 + // inboundFlowType 7 + // Source 20 + // inboundSyncRuleScopingConditionString 18 + // Attribute 10 + // Type 4 + // Multi-valued 4 + // Indexed 4 // Header Row 1 - // Attribute - headerTable.Rows.Add(new OrderedDictionary { { "RowIndex", 0 }, { "ColumnIndex", 0 }, { "ColumnName", "Attribute" }, { "RowSpan", 3 }, { "ColSpan", 1 }, { "ColWidth", 13 } }.Values.Cast().ToArray()); - - // Type - headerTable.Rows.Add(new OrderedDictionary { { "RowIndex", 0 }, { "ColumnIndex", 1 }, { "ColumnName", "Type" }, { "RowSpan", 3 }, { "ColSpan", 1 }, { "ColWidth", 7 } }.Values.Cast().ToArray()); - - // Multi-valued - headerTable.Rows.Add(new OrderedDictionary { { "RowIndex", 0 }, { "ColumnIndex", 2 }, { "ColumnName", "Multi-valued" }, { "RowSpan", 3 }, { "ColSpan", 1 }, { "ColWidth", 4 } }.Values.Cast().ToArray()); - - // Indexed - headerTable.Rows.Add(new OrderedDictionary { { "RowIndex", 0 }, { "ColumnIndex", 3 }, { "ColumnName", "Indexed" }, { "RowSpan", 3 }, { "ColSpan", 1 }, { "ColWidth", 4 } }.Values.Cast().ToArray()); - - // Precedence - headerTable.Rows.Add(new OrderedDictionary { { "RowIndex", 0 }, { "ColumnIndex", 4 }, { "ColumnName", "Precedence" }, { "RowSpan", 1 }, { "ColSpan", 7 }, { "ColWidth", 0 } }.Values.Cast().ToArray()); - - // Header Row 2 // Precedence Display - Rank or Manual or Equal - headerTable.Rows.Add(new OrderedDictionary { { "RowIndex", 1 }, { "ColumnIndex", 0 }, { "ColumnName", "Rank" }, { "RowSpan", 2 }, { "ColSpan", 1 }, { "ColWidth", 4 } }.Values.Cast().ToArray()); + headerTable.Rows.Add(new OrderedDictionary { { "RowIndex", 0 }, { "ColumnIndex", 0 }, { "ColumnName", "Rank" }, { "RowSpan", 1 }, { "ColSpan", 1 }, { "ColWidth", 4 } }.Values.Cast().ToArray()); // Connector - headerTable.Rows.Add(new OrderedDictionary { { "RowIndex", 1 }, { "ColumnIndex", 1 }, { "ColumnName", "Connector" }, { "RowSpan", 2 }, { "ColSpan", 1 }, { "ColWidth", 15 } }.Values.Cast().ToArray()); + headerTable.Rows.Add(new OrderedDictionary { { "RowIndex", 0 }, { "ColumnIndex", 1 }, { "ColumnName", "Connector" }, { "RowSpan", 1 }, { "ColSpan", 1 }, { "ColWidth", 10 } }.Values.Cast().ToArray()); // Inbound Sync Rule - headerTable.Rows.Add(new OrderedDictionary { { "RowIndex", 1 }, { "ColumnIndex", 2 }, { "ColumnName", "Inbound Sync Rule" }, { "RowSpan", 2 }, { "ColSpan", 1 }, { "ColWidth", 15 } }.Values.Cast().ToArray()); + headerTable.Rows.Add(new OrderedDictionary { { "RowIndex", 0 }, { "ColumnIndex", 2 }, { "ColumnName", "Inbound Sync Rule" }, { "RowSpan", 1 }, { "ColSpan", 1 }, { "ColWidth", 10 } }.Values.Cast().ToArray()); + + // inboundFlowType + headerTable.Rows.Add(new OrderedDictionary { { "RowIndex", 0 }, { "ColumnIndex", 3 }, { "ColumnName", "Inbound Flow Type" }, { "RowSpan", 1 }, { "ColSpan", 1 }, { "ColWidth", 7 } }.Values.Cast().ToArray()); // Source - headerTable.Rows.Add(new OrderedDictionary { { "RowIndex", 1 }, { "ColumnIndex", 3 }, { "ColumnName", "Source" }, { "RowSpan", 2 }, { "ColSpan", 1 }, { "ColWidth", 15 } }.Values.Cast().ToArray()); + headerTable.Rows.Add(new OrderedDictionary { { "RowIndex", 0 }, { "ColumnIndex", 4 }, { "ColumnName", "Source" }, { "RowSpan", 1 }, { "ColSpan", 1 }, { "ColWidth", 23 } }.Values.Cast().ToArray()); - // Scoping Condition - headerTable.Rows.Add(new OrderedDictionary { { "RowIndex", 1 }, { "ColumnIndex", 4 }, { "ColumnName", "Scoping Condition" }, { "RowSpan", 1 }, { "ColSpan", 3 }, { "ColWidth", 0 } }.Values.Cast().ToArray()); + // Inbound Sync Rule Scoping Condition String + headerTable.Rows.Add(new OrderedDictionary { { "RowIndex", 0 }, { "ColumnIndex", 5 }, { "ColumnName", "Scoping Condition" }, { "RowSpan", 1 }, { "ColSpan", 1 }, { "ColWidth", 21 } }.Values.Cast().ToArray()); - // Header Row 3 - // CS Attribute - headerTable.Rows.Add(new OrderedDictionary { { "RowIndex", 2 }, { "ColumnIndex", 0 }, { "ColumnName", "CS Attribute" }, { "RowSpan", 1 }, { "ColSpan", 1 }, { "ColWidth", 10 } }.Values.Cast().ToArray()); + // Attribute + headerTable.Rows.Add(new OrderedDictionary { { "RowIndex", 0 }, { "ColumnIndex", 6 }, { "ColumnName", "Metaverse Attribute" }, { "RowSpan", 1 }, { "ColSpan", 1 }, { "ColWidth", 13 } }.Values.Cast().ToArray()); - // Operator - headerTable.Rows.Add(new OrderedDictionary { { "RowIndex", 2 }, { "ColumnIndex", 1 }, { "ColumnName", "Operator" }, { "RowSpan", 1 }, { "ColSpan", 1 }, { "ColWidth", 8 } }.Values.Cast().ToArray()); + // Type + headerTable.Rows.Add(new OrderedDictionary { { "RowIndex", 0 }, { "ColumnIndex", 7 }, { "ColumnName", "Metaverse Object Type" }, { "RowSpan", 1 }, { "ColSpan", 1 }, { "ColWidth", 4 } }.Values.Cast().ToArray()); - // Value - headerTable.Rows.Add(new OrderedDictionary { { "RowIndex", 2 }, { "ColumnIndex", 2 }, { "ColumnName", "Value" }, { "RowSpan", 1 }, { "ColSpan", 1 }, { "ColWidth", 5 } }.Values.Cast().ToArray()); + // Multivalued + headerTable.Rows.Add(new OrderedDictionary { { "RowIndex", 0 }, { "ColumnIndex", 8 }, { "ColumnName", "Multi-valued" }, { "RowSpan", 1 }, { "ColSpan", 1 }, { "ColWidth", 4 } }.Values.Cast().ToArray()); + + // Indexed + headerTable.Rows.Add(new OrderedDictionary { { "RowIndex", 0 }, { "ColumnIndex", 9 }, { "ColumnName", "Indexed" }, { "RowSpan", 1 }, { "ColSpan", 1 }, { "ColWidth", 4 } }.Values.Cast().ToArray()); headerTable.AcceptChanges(); From e584dc1cb167a9baf11e6e9c9f5ceaeae6d3b7b0 Mon Sep 17 00:00:00 2001 From: FIMTooler Date: Tue, 14 Nov 2023 17:35:50 -0500 Subject: [PATCH 04/10] Added new function for writing rows from customized tables to allow rowspans instead of duplicate data --- .../Documenter.cs | 100 +++++++++++++++++- 1 file changed, 99 insertions(+), 1 deletion(-) diff --git a/src/AzureADConnectSyncDocumenter/Documenter.cs b/src/AzureADConnectSyncDocumenter/Documenter.cs index d91cc61..3a91bb3 100644 --- a/src/AzureADConnectSyncDocumenter/Documenter.cs +++ b/src/AzureADConnectSyncDocumenter/Documenter.cs @@ -1798,6 +1798,97 @@ protected void WriteRows(DataRowCollection rows) } } + /// + /// Writes the rows for customized tables so that the following columns can span rows and not be duplicated - "metaverseAttribute", "metaverseObjectType", "Multivalued", "Indexed" + /// + /// The rows. + protected void WriteCustomizedRows(DataRow[] rows) + { + Logger.Instance.WriteMethodEntry(); + + try + { + if (rows == null) + { + throw new ArgumentNullException("rows"); + } + else if (rows.Length == 0) + { + return; + } + var test = rows.GroupBy(row => row["metaverseAttribute"]); + var printTable = this.DiffgramDataSet.Tables["PrintSettings"]; + var maxCellCount = printTable.Select("Hidden = false").Count(); + foreach (var rowx in test) + { + var rowCount = rowx.Count(); + int currentCellIndex = 0; + bool writtenOnce = false; + for (var i = 0; i < rowCount; ++i) + { + var row = rowx.ElementAt(i); + var cellClass = (string)row[Documenter.RowStateColumn]; + + if (currentCellIndex == 0) + { + // Start the new row + this.ReportWriter.WriteBeginTag("tr"); + if ((row[Documenter.HtmlTableRowVisibilityStatusColumn] as string) == Documenter.CanHide) + { + this.ReportWriter.WriteAttribute("class", cellClass + " " + Documenter.CanHide); + } + else + { + this.ReportWriter.WriteAttribute("class", cellClass); + } + + this.ReportWriter.Write(HtmlTextWriter.TagRightChar); + } + + currentCellIndex = printTable.Select("Hidden = false AND TableIndex < " + 0).Count(); + + var rowSpan = 1; + + var printColumns = printTable.Select("Hidden = false AND TableIndex = " + 0).Select(rowX => rowX["ColumnIndex"]); + var writeOnceColumns = new string[] { "metaverseAttribute", "metaverseObjectType", "Multivalued", "Indexed" }; + foreach (var column in row.Table.Columns.Cast().Where(column => printColumns.Contains(column.Ordinal))) + { + if (writeOnceColumns.Contains(column.ColumnName)) + { + if (!writtenOnce) + { + this.WriteCell(row, column, rowCount, 0); + } + } + else + { + this.WriteCell(row, column, rowSpan, 0); + } + ++currentCellIndex; + } + // complete the row if required + for (; currentCellIndex < maxCellCount; ++currentCellIndex) + { + this.ReportWriter.WriteBeginTag("td"); + this.ReportWriter.WriteAttribute("class", cellClass); + this.ReportWriter.WriteAttribute("rowspan", "1"); + this.ReportWriter.Write(HtmlTextWriter.TagRightChar); + this.ReportWriter.Write("-"); + this.ReportWriter.WriteEndTag("td"); + } + this.ReportWriter.WriteEndTag("tr"); + this.ReportWriter.WriteLine(); + currentCellIndex = 0; + writtenOnce = true; + } + } + } + finally + { + Logger.Instance.WriteMethodExit(); + } + } + /// /// Writes the rows. /// @@ -2169,7 +2260,14 @@ protected void WriteTable(DataTable dataTable, DataTable headerTable, HtmlTableS if (dataTable != null && dataTable.Rows.Count > 0) { - this.WriteRows(dataTable.Rows); + if (dataTable.TableName.StartsWith("customized")) + { + this.WriteCustomizedRows(dataTable.Rows.Cast().ToArray()); + } + else + { + this.WriteRows(dataTable.Rows); + } } #endregion rows From 684f34c6ff2804264b9275e5351e684c15151f69 Mon Sep 17 00:00:00 2001 From: FIMTooler Date: Wed, 15 Nov 2023 13:33:22 -0500 Subject: [PATCH 05/10] Added sticky table headers so they remain visible while scrolling through long tables --- src/AzureADConnectSyncDocumenter/Scripts/Documenter.css | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/AzureADConnectSyncDocumenter/Scripts/Documenter.css b/src/AzureADConnectSyncDocumenter/Scripts/Documenter.css index a2c127a..9eb577b 100644 --- a/src/AzureADConnectSyncDocumenter/Scripts/Documenter.css +++ b/src/AzureADConnectSyncDocumenter/Scripts/Documenter.css @@ -40,6 +40,8 @@ th { border: none; border-top: 2px solid #999999; border-bottom: 2px solid #999999; + position: sticky; + top: 0; } th.column-th2 { From 60f5e5c16431c798d7ffc514944af5b00c4f42b5 Mon Sep 17 00:00:00 2001 From: FIMTooler Date: Wed, 15 Nov 2023 13:35:50 -0500 Subject: [PATCH 06/10] Added Precedence\Rank columns Fixed bookmarks by adding Guids back to table Removed redundance inbound\outbound text from table headers --- .../ConnectorDocumenter.cs | 305 +++++++++++------- 1 file changed, 188 insertions(+), 117 deletions(-) diff --git a/src/AzureADConnectSyncDocumenter/ConnectorDocumenter.cs b/src/AzureADConnectSyncDocumenter/ConnectorDocumenter.cs index b9ce599..43b9cbb 100644 --- a/src/AzureADConnectSyncDocumenter/ConnectorDocumenter.cs +++ b/src/AzureADConnectSyncDocumenter/ConnectorDocumenter.cs @@ -1252,25 +1252,33 @@ protected void CreateConnectorObjectImportAttributeFlowsSummaryDataSets() { Logger.Instance.WriteMethodEntry(); //columns and order - //inboundSyncRuleName, inboundSyncRuleScopingConditionString, inboundExpression, inboundFlowType, inboundArrow, metaverseAttribute, metaverseObjectType, outboundArrow, outboundConnectorName, outboundSyncRuleName, outboundSyncRuleScopingConditionString, outboundObjectType, outboundFlowType, outboundExpression, targetAttribute + //inboundSyncRuleName, inboundSyncRuleGuid inboundSyncRuleScopingConditionString, inboundExpression, inboundFlowType, inboundPrecedence, inboundArrow, metaverseAttribute, metaverseObjectType, outboundArrow, outboundPrecedence, outboundConnectorName, outboundConnectorGuid, outboundSyncRuleName, outboundSyncRuleGuid outboundSyncRuleScopingConditionString, outboundObjectType, outboundFlowType, outboundExpression, targetAttribute try { var table = new DataTable("customizedImportSummary") { Locale = CultureInfo.InvariantCulture }; var column1 = new DataColumn("inboundSyncRuleName"); - var column2 = new DataColumn("inboundSyncRuleScopingConditionString"); - var column3 = new DataColumn("inboundExpression"); - var column4 = new DataColumn("inboundFlowType"); - var column5 = new DataColumn("inboundArrow"); - var column6 = new DataColumn("metaverseAttribute"); - var column7 = new DataColumn("metaverseObjectType"); - var column8 = new DataColumn("outboundArrow"); - var column9 = new DataColumn("outboundConnectorName"); - var column10 = new DataColumn("outboundSyncRuleName"); - var column11 = new DataColumn("outboundSyncRuleScopingConditionString"); - var column12 = new DataColumn("outboundObjectType"); - var column13 = new DataColumn("outboundFlowType"); - var column14 = new DataColumn("outboundExpression"); - var column15 = new DataColumn("targetAttribute"); + //required for bookmarks + var column2 = new DataColumn("inboundSyncRuleGuid"); + var column3 = new DataColumn("inboundSyncRuleScopingConditionString"); + var column4 = new DataColumn("inboundExpression"); + var column5 = new DataColumn("inboundFlowType"); + var column6 = new DataColumn("inboundPrecedence"); + var column7 = new DataColumn("inboundArrow"); + var column8 = new DataColumn("metaverseAttribute"); + var column9 = new DataColumn("metaverseObjectType"); + var column10 = new DataColumn("outboundArrow"); + var column11 = new DataColumn("outboundPrecedence"); + var column12 = new DataColumn("outboundConnectorName"); + //required for bookmarks + var column13 = new DataColumn("outboundConnectorGuid"); + var column14 = new DataColumn("outboundSyncRuleName"); + //required for bookmarks + var column15 = new DataColumn("outboundSyncRuleGuid"); + var column16 = new DataColumn("outboundSyncRuleScopingConditionString"); + var column17 = new DataColumn("outboundObjectType"); + var column18 = new DataColumn("outboundFlowType"); + var column19 = new DataColumn("outboundExpression"); + var column20 = new DataColumn("targetAttribute"); table.Columns.Add(column1); table.Columns.Add(column2); @@ -1287,7 +1295,12 @@ protected void CreateConnectorObjectImportAttributeFlowsSummaryDataSets() table.Columns.Add(column13); table.Columns.Add(column14); table.Columns.Add(column15); - table.PrimaryKey = new[] { column1, column2, column3, column4, column5, column6, column7, column8, column9, column10, column11, column12, column13, column14, column15 }; + table.Columns.Add(column16); + table.Columns.Add(column17); + table.Columns.Add(column18); + table.Columns.Add(column19); + table.Columns.Add(column20); + table.PrimaryKey = new[] { column1, column2, column3, column4, column5, column6, column7, column8, column9, column10, column11, column12, column13, column14, column15, column16, column17, column18, column19, column20 }; this.PilotDataSet = new DataSet("ImportAttributeFlowsSummary") { Locale = CultureInfo.InvariantCulture }; this.PilotDataSet.Tables.Add(table); @@ -1315,52 +1328,67 @@ protected DataTable GetConnectorObjectImportAttributeFlowsSummaryPrintTable() { var printTable = Documenter.GetPrintTable(); //columns and order - //inboundSyncRuleName, inboundSyncRuleScopingConditionString, inboundExpression, inboundFlowType, inboundArrow, metaverseAttribute, metaverseObjectType, outboundArrow, outboundConnectorName, outboundSyncRuleName, outboundSyncRuleScopingConditionString, outboundObjectType, outboundFlowType, outboundExpression, targetAttribute + //inboundSyncRuleName, inboundSyncRuleGuid inboundSyncRuleScopingConditionString, inboundExpression, inboundFlowType, inboundPrecedence, inboundArrow, metaverseAttribute, metaverseObjectType, outboundArrow, outboundPrecedence, outboundConnectorName, outboundConnectorGuid, outboundSyncRuleName, outboundSyncRuleGuid outboundSyncRuleScopingConditionString, outboundObjectType, outboundFlowType, outboundExpression, targetAttribute // Inbound Sync Rule Name - printTable.Rows.Add(new OrderedDictionary { { "TableIndex", 0 }, { "ColumnIndex", 0 }, { "Hidden", false }, { "SortOrder", -1 }, { "BookmarkIndex", -1 }, { "JumpToBookmarkIndex", 5 }, { "ChangeIgnored", false } }.Values.Cast().ToArray()); + printTable.Rows.Add(new OrderedDictionary { { "TableIndex", 0 }, { "ColumnIndex", 0 }, { "Hidden", false }, { "SortOrder", -1 }, { "BookmarkIndex", -1 }, { "JumpToBookmarkIndex", 1 }, { "ChangeIgnored", false } }.Values.Cast().ToArray()); + + // Inbound Sync Rule Guid - required for bookmarks + printTable.Rows.Add(new OrderedDictionary { { "TableIndex", 0 }, { "ColumnIndex", 1 }, { "Hidden", true }, { "SortOrder", -1 }, { "BookmarkIndex", -1 }, { "JumpToBookmarkIndex", -1 }, { "ChangeIgnored", false } }.Values.Cast().ToArray()); // Inbound Sync Rule Scoping Condition String - printTable.Rows.Add(new OrderedDictionary { { "TableIndex", 0 }, { "ColumnIndex", 1 }, { "Hidden", false }, { "SortOrder", -1 }, { "BookmarkIndex", -1 }, { "JumpToBookmarkIndex", -1 }, { "ChangeIgnored", false } }.Values.Cast().ToArray()); + printTable.Rows.Add(new OrderedDictionary { { "TableIndex", 0 }, { "ColumnIndex", 2 }, { "Hidden", false }, { "SortOrder", -1 }, { "BookmarkIndex", -1 }, { "JumpToBookmarkIndex", -1 }, { "ChangeIgnored", false } }.Values.Cast().ToArray()); // Inbound Expression - printTable.Rows.Add(new OrderedDictionary { { "TableIndex", 0 }, { "ColumnIndex", 2 }, { "Hidden", false }, { "SortOrder", -1 }, { "BookmarkIndex", -1 }, { "JumpToBookmarkIndex", -1 }, { "ChangeIgnored", false } }.Values.Cast().ToArray()); + printTable.Rows.Add(new OrderedDictionary { { "TableIndex", 0 }, { "ColumnIndex", 3 }, { "Hidden", false }, { "SortOrder", -1 }, { "BookmarkIndex", -1 }, { "JumpToBookmarkIndex", -1 }, { "ChangeIgnored", false } }.Values.Cast().ToArray()); // Inbound Flow Type - printTable.Rows.Add(new OrderedDictionary { { "TableIndex", 0 }, { "ColumnIndex", 3 }, { "Hidden", false }, { "SortOrder", -1 }, { "BookmarkIndex", -1 }, { "JumpToBookmarkIndex", -1 }, { "ChangeIgnored", true } }.Values.Cast().ToArray()); + printTable.Rows.Add(new OrderedDictionary { { "TableIndex", 0 }, { "ColumnIndex", 4 }, { "Hidden", false }, { "SortOrder", -1 }, { "BookmarkIndex", -1 }, { "JumpToBookmarkIndex", -1 }, { "ChangeIgnored", true } }.Values.Cast().ToArray()); + + // Inbound Precedence + printTable.Rows.Add(new OrderedDictionary { { "TableIndex", 0 }, { "ColumnIndex", 5 }, { "Hidden", false }, { "SortOrder", -1 }, { "BookmarkIndex", -1 }, { "JumpToBookmarkIndex", -1 }, { "ChangeIgnored", true } }.Values.Cast().ToArray()); // Inbound Arrow - printTable.Rows.Add(new OrderedDictionary { { "TableIndex", 0 }, { "ColumnIndex", 4 }, { "Hidden", false }, { "SortOrder", -1 }, { "BookmarkIndex", -1 }, { "JumpToBookmarkIndex", -1 }, { "ChangeIgnored", true } }.Values.Cast().ToArray()); + printTable.Rows.Add(new OrderedDictionary { { "TableIndex", 0 }, { "ColumnIndex", 6 }, { "Hidden", false }, { "SortOrder", -1 }, { "BookmarkIndex", -1 }, { "JumpToBookmarkIndex", -1 }, { "ChangeIgnored", true } }.Values.Cast().ToArray()); // Metaverse Attribute - printTable.Rows.Add(new OrderedDictionary { { "TableIndex", 0 }, { "ColumnIndex", 5 }, { "Hidden", false }, { "SortOrder", 0 }, { "BookmarkIndex", -1 }, { "JumpToBookmarkIndex", -1 }, { "ChangeIgnored", false } }.Values.Cast().ToArray()); + printTable.Rows.Add(new OrderedDictionary { { "TableIndex", 0 }, { "ColumnIndex", 7 }, { "Hidden", false }, { "SortOrder", 0 }, { "BookmarkIndex", -1 }, { "JumpToBookmarkIndex", -1 }, { "ChangeIgnored", false } }.Values.Cast().ToArray()); // Metaverse Object Type - printTable.Rows.Add(new OrderedDictionary { { "TableIndex", 0 }, { "ColumnIndex", 6 }, { "Hidden", false }, { "SortOrder", 0 }, { "BookmarkIndex", -1 }, { "JumpToBookmarkIndex", -1 }, { "ChangeIgnored", false } }.Values.Cast().ToArray()); + printTable.Rows.Add(new OrderedDictionary { { "TableIndex", 0 }, { "ColumnIndex", 8 }, { "Hidden", false }, { "SortOrder", 0 }, { "BookmarkIndex", -1 }, { "JumpToBookmarkIndex", -1 }, { "ChangeIgnored", false } }.Values.Cast().ToArray()); // Outbound Arrow - printTable.Rows.Add(new OrderedDictionary { { "TableIndex", 0 }, { "ColumnIndex", 7 }, { "Hidden", false }, { "SortOrder", -1 }, { "BookmarkIndex", -1 }, { "JumpToBookmarkIndex", -1 }, { "ChangeIgnored", true } }.Values.Cast().ToArray()); + printTable.Rows.Add(new OrderedDictionary { { "TableIndex", 0 }, { "ColumnIndex", 9 }, { "Hidden", false }, { "SortOrder", -1 }, { "BookmarkIndex", -1 }, { "JumpToBookmarkIndex", -1 }, { "ChangeIgnored", true } }.Values.Cast().ToArray()); + + // Outbound Precedence + printTable.Rows.Add(new OrderedDictionary { { "TableIndex", 0 }, { "ColumnIndex", 10 }, { "Hidden", false }, { "SortOrder", -1 }, { "BookmarkIndex", -1 }, { "JumpToBookmarkIndex", -1 }, { "ChangeIgnored", false } }.Values.Cast().ToArray()); // Outbound Connector Name - printTable.Rows.Add(new OrderedDictionary { { "TableIndex", 0 }, { "ColumnIndex", 8 }, { "Hidden", false }, { "SortOrder", -1 }, { "BookmarkIndex", -1 }, { "JumpToBookmarkIndex", 8 }, { "ChangeIgnored", false } }.Values.Cast().ToArray()); + printTable.Rows.Add(new OrderedDictionary { { "TableIndex", 0 }, { "ColumnIndex", 11 }, { "Hidden", false }, { "SortOrder", -1 }, { "BookmarkIndex", -1 }, { "JumpToBookmarkIndex", 12 }, { "ChangeIgnored", false } }.Values.Cast().ToArray()); + + // Outbound Connector Guid - required for bookmarks + printTable.Rows.Add(new OrderedDictionary { { "TableIndex", 0 }, { "ColumnIndex", 12 }, { "Hidden", true }, { "SortOrder", -1 }, { "BookmarkIndex", -1 }, { "JumpToBookmarkIndex", -1 }, { "ChangeIgnored", false } }.Values.Cast().ToArray()); // Outbound Sync Rule Name - printTable.Rows.Add(new OrderedDictionary { { "TableIndex", 0 }, { "ColumnIndex", 9 }, { "Hidden", false }, { "SortOrder", -1 }, { "BookmarkIndex", -1 }, { "JumpToBookmarkIndex", 9 }, { "ChangeIgnored", false } }.Values.Cast().ToArray()); + printTable.Rows.Add(new OrderedDictionary { { "TableIndex", 0 }, { "ColumnIndex", 13 }, { "Hidden", false }, { "SortOrder", -1 }, { "BookmarkIndex", -1 }, { "JumpToBookmarkIndex", 14 }, { "ChangeIgnored", false } }.Values.Cast().ToArray()); + + // Outbound Sync Rule Guid - required for bookmarks + printTable.Rows.Add(new OrderedDictionary { { "TableIndex", 0 }, { "ColumnIndex", 14 }, { "Hidden", true }, { "SortOrder", -1 }, { "BookmarkIndex", -1 }, { "JumpToBookmarkIndex", -1 }, { "ChangeIgnored", false } }.Values.Cast().ToArray()); // Outbound Sync Rule Scoping Condition String - printTable.Rows.Add(new OrderedDictionary { { "TableIndex", 0 }, { "ColumnIndex", 10 }, { "Hidden", false }, { "SortOrder", -1 }, { "BookmarkIndex", -1 }, { "JumpToBookmarkIndex", -1 }, { "ChangeIgnored", false } }.Values.Cast().ToArray()); + printTable.Rows.Add(new OrderedDictionary { { "TableIndex", 0 }, { "ColumnIndex", 15 }, { "Hidden", false }, { "SortOrder", -1 }, { "BookmarkIndex", -1 }, { "JumpToBookmarkIndex", -1 }, { "ChangeIgnored", false } }.Values.Cast().ToArray()); // Outbound Object Type - printTable.Rows.Add(new OrderedDictionary { { "TableIndex", 0 }, { "ColumnIndex", 11 }, { "Hidden", false }, { "SortOrder", -1 }, { "BookmarkIndex", -1 }, { "JumpToBookmarkIndex", -1 }, { "ChangeIgnored", false } }.Values.Cast().ToArray()); + printTable.Rows.Add(new OrderedDictionary { { "TableIndex", 0 }, { "ColumnIndex", 16 }, { "Hidden", false }, { "SortOrder", -1 }, { "BookmarkIndex", -1 }, { "JumpToBookmarkIndex", -1 }, { "ChangeIgnored", false } }.Values.Cast().ToArray()); // Outbound Flow Type - printTable.Rows.Add(new OrderedDictionary { { "TableIndex", 0 }, { "ColumnIndex", 12 }, { "Hidden", false }, { "SortOrder", -1 }, { "BookmarkIndex", -1 }, { "JumpToBookmarkIndex", -1 }, { "ChangeIgnored", true } }.Values.Cast().ToArray()); + printTable.Rows.Add(new OrderedDictionary { { "TableIndex", 0 }, { "ColumnIndex", 17 }, { "Hidden", false }, { "SortOrder", -1 }, { "BookmarkIndex", -1 }, { "JumpToBookmarkIndex", -1 }, { "ChangeIgnored", true } }.Values.Cast().ToArray()); // Outbound Expression - printTable.Rows.Add(new OrderedDictionary { { "TableIndex", 0 }, { "ColumnIndex", 13 }, { "Hidden", false }, { "SortOrder", -1 }, { "BookmarkIndex", -1 }, { "JumpToBookmarkIndex", -1 }, { "ChangeIgnored", false } }.Values.Cast().ToArray()); + printTable.Rows.Add(new OrderedDictionary { { "TableIndex", 0 }, { "ColumnIndex", 18 }, { "Hidden", false }, { "SortOrder", -1 }, { "BookmarkIndex", -1 }, { "JumpToBookmarkIndex", -1 }, { "ChangeIgnored", false } }.Values.Cast().ToArray()); // Target Attribute - printTable.Rows.Add(new OrderedDictionary { { "TableIndex", 0 }, { "ColumnIndex", 14 }, { "Hidden", false }, { "SortOrder", -1 }, { "BookmarkIndex", -1 }, { "JumpToBookmarkIndex", -1 }, { "ChangeIgnored", false } }.Values.Cast().ToArray()); + printTable.Rows.Add(new OrderedDictionary { { "TableIndex", 0 }, { "ColumnIndex", 19 }, { "Hidden", false }, { "SortOrder", -1 }, { "BookmarkIndex", -1 }, { "JumpToBookmarkIndex", -1 }, { "ChangeIgnored", false } }.Values.Cast().ToArray()); printTable.AcceptChanges(); @@ -1379,7 +1407,7 @@ protected DataTable GetConnectorObjectImportAttributeFlowsSummaryPrintTable() protected void FillConnectorObjectImportAttributeFlowsSummary(bool pilotConfig) { //columns and order - //inboundSyncRuleName, inboundSyncRuleScopingConditionString, inboundExpression, inboundFlowType, inboundArrow, metaverseAttribute, metaverseObjectType, outboundArrow, outboundConnectorName, outboundSyncRuleName, outboundSyncRuleScopingConditionString, outboundObjectType, outboundFlowType, outboundExpression, targetAttribute + //inboundSyncRuleName, inboundSyncRuleGuid inboundSyncRuleScopingConditionString, inboundExpression, inboundFlowType, inboundPrecedence, inboundArrow, metaverseAttribute, metaverseObjectType, outboundArrow, outboundPrecedence, outboundConnectorName, outboundConnectorGuid, outboundSyncRuleName, outboundSyncRuleGuid outboundSyncRuleScopingConditionString, outboundObjectType, outboundFlowType, outboundExpression, targetAttribute Logger.Instance.WriteMethodEntry("Pilot Config: '{0}'.", pilotConfig); try @@ -1450,17 +1478,15 @@ orderby outboundSyncRulePrecedence string inboundExpression = ""; string inboundSyncRuleScopingConditionString = ""; string inboundFlowType = ""; + string inboundPrecedence = ""; if (inboundSyncRules.ElementAtOrDefault(i) != null) { inboundSyncRuleName = (string)inboundSyncRules.ElementAt(i).Element("name"); inboundSyncRuleGuid = (string)inboundSyncRules.ElementAt(i).Element("id"); metaverseObjectType = (string)inboundSyncRules.ElementAt(i).Element("targetObjectType"); + inboundPrecedence = (string)inboundSyncRules.ElementAt(i).Element("precedence"); ++inboundSyncRuleRank; - if (inboundSyncRules.ElementAt(i).XPathSelectElements("./attribute-mappings/mapping[dest = '" + metaverseAttribute + "']").Count() > 1) - { - string s = ""; - } var transformation = inboundSyncRules.ElementAt(i).XPathSelectElement("./attribute-mappings/mapping[dest = '" + metaverseAttribute + "']"); expression = (string)transformation.Element("expression"); srcAttribute = (string)transformation.XPathSelectElement("src/attr"); @@ -1497,6 +1523,7 @@ orderby outboundSyncRulePrecedence string outboundSyncRuleScopingCondition = ""; string outboundObjectType = ""; string outboundFlowType = ""; + string outboundPrecedence = ""; if (outboundSyncRules.ElementAtOrDefault(i) != null) { outboundSyncRuleName = (string)outboundSyncRules.ElementAt(i).Element("name"); @@ -1504,6 +1531,7 @@ orderby outboundSyncRulePrecedence metaverseObjectType = (string)outboundSyncRules.ElementAt(i).Element("sourceObjectType"); outboundConnectorGuid = ((string)outboundSyncRules.ElementAt(i).Element("connector") ?? string.Empty).ToUpperInvariant(); outboundObjectType = (string)outboundSyncRules.ElementAt(i).Element("targetObjectType"); + outboundPrecedence = (string)outboundSyncRules.ElementAt(i).Element("precedence"); outboundConnectorName = (string)config.XPathSelectElement(Documenter.GetConnectorXmlRootXPath(pilotConfig) + "/ma-data[translate(id, '" + Documenter.LowercaseLetters + "', '" + Documenter.UppercaseLetters + "') = '" + outboundConnectorGuid + "']/name"); if (string.IsNullOrEmpty(outboundConnectorName)) { @@ -1544,8 +1572,8 @@ orderby outboundSyncRulePrecedence } } //columns and order - //inboundSyncRuleName, inboundSyncRuleScopingConditionString, inboundExpression, inboundFlowType, inboundArrow, metaverseAttribute, metaverseObjectType, outboundArrow, outboundConnectorName, outboundSyncRuleName, outboundSyncRuleScopingConditionString, outboundObjectType, outboundFlowType, outboundExpression, targetAttribute - Documenter.AddRow(table, new object[] { inboundSyncRuleName, inboundSyncRuleScopingConditionString, inboundExpression, inboundFlowType, "→", metaverseAttribute, metaverseObjectType, "→", outboundConnectorName, outboundSyncRuleName, outboundSyncRuleScopingCondition, outboundObjectType, outboundFlowType, outboundExpression, targetAttribute }); + //inboundSyncRuleName, inboundSyncRuleGuid inboundSyncRuleScopingConditionString, inboundExpression, inboundFlowType, inboundPrecedence, inboundArrow, metaverseAttribute, metaverseObjectType, outboundArrow, outboundPrecedence, outboundConnectorName, outboundConnectorGuid, outboundSyncRuleName, outboundSyncRuleGuid outboundSyncRuleScopingConditionString, outboundObjectType, outboundFlowType, outboundExpression, targetAttribute + Documenter.AddRow(table, new object[] { inboundSyncRuleName, inboundSyncRuleGuid, inboundSyncRuleScopingConditionString, inboundExpression, inboundFlowType, inboundPrecedence, "→", metaverseAttribute, metaverseObjectType, "→", outboundPrecedence, outboundConnectorName, outboundConnectorGuid, outboundSyncRuleName, outboundSyncRuleGuid, outboundSyncRuleScopingCondition, outboundObjectType, outboundFlowType, outboundExpression, targetAttribute }); } } } @@ -1590,64 +1618,71 @@ protected DataTable GetConnectorObjectImportAttributeFlowsSummaryHeaderTable() { var headerTable = Documenter.GetHeaderTable(); - //columns and order - //inboundSyncRuleName, inboundSyncRuleScopingConditionString, inboundExpression, inboundFlowType, inboundArrow, metaverseAttribute, metaverseObjectType, outboundArrow, outboundConnectorName, outboundSyncRuleName, outboundSyncRuleScopingConditionString, outboundObjectType, outboundFlowType, outboundExpression, targetAttribute - + //columns and order - doesn't include hidden GUID columns + //inboundSyncRuleName, inboundSyncRuleScopingConditionString, inboundExpression, inboundFlowType, inboundPrecedence, inboundArrow, metaverseAttribute, metaverseObjectType, outboundArrow, outboundPrecedence, outboundConnectorName, outboundSyncRuleName, outboundSyncRuleScopingConditionString, outboundObjectType, outboundFlowType, outboundExpression, targetAttribute + //colWidths + //10 + 1 + 10 + 6 + 5 + 2 + 8 + 5 + 2 + 5 + 10 + 10 + 1 + 5 + 6 + 10 + 7 // Header Row 1 // Import Flows - headerTable.Rows.Add(new OrderedDictionary { { "RowIndex", 0 }, { "ColumnIndex", 0 }, { "ColumnName", "Import Flows" }, { "RowSpan", 1 }, { "ColSpan", 5 }, { "ColWidth", 0 } }.Values.Cast().ToArray()); + headerTable.Rows.Add(new OrderedDictionary { { "RowIndex", 0 }, { "ColumnIndex", 0 }, { "ColumnName", "Import Flows" }, { "RowSpan", 1 }, { "ColSpan", 6 }, { "ColWidth", 0 } }.Values.Cast().ToArray()); // MV Attribute headerTable.Rows.Add(new OrderedDictionary { { "RowIndex", 0 }, { "ColumnIndex", 1 }, { "ColumnName", "Metaverse" }, { "RowSpan", 1 }, { "ColSpan", 3 }, { "ColWidth", 0 } }.Values.Cast().ToArray()); // Export Flows - headerTable.Rows.Add(new OrderedDictionary { { "RowIndex", 0 }, { "ColumnIndex", 2 }, { "ColumnName", "Export Flows" }, { "RowSpan", 1 }, { "ColSpan", 7 }, { "ColWidth", 0 } }.Values.Cast().ToArray()); + headerTable.Rows.Add(new OrderedDictionary { { "RowIndex", 0 }, { "ColumnIndex", 2 }, { "ColumnName", "Export Flows" }, { "RowSpan", 1 }, { "ColSpan", 9 }, { "ColWidth", 0 } }.Values.Cast().ToArray()); // Header Row 2 // Inbound Sync Rule Name - headerTable.Rows.Add(new OrderedDictionary { { "RowIndex", 1 }, { "ColumnIndex", 0 }, { "ColumnName", "Inbound Sync Rule" }, { "RowSpan", 1 }, { "ColSpan", 1 }, { "ColWidth", 10 } }.Values.Cast().ToArray()); + headerTable.Rows.Add(new OrderedDictionary { { "RowIndex", 1 }, { "ColumnIndex", 0 }, { "ColumnName", "Sync Rule" }, { "RowSpan", 1 }, { "ColSpan", 1 }, { "ColWidth", 10 } }.Values.Cast().ToArray()); // Inbound Sync Rule Scoping Condition String - headerTable.Rows.Add(new OrderedDictionary { { "RowIndex", 1 }, { "ColumnIndex", 1 }, { "ColumnName", "Inbound Sync Rule Scoping Condition" }, { "RowSpan", 1 }, { "ColSpan", 1 }, { "ColWidth", 10 } }.Values.Cast().ToArray()); + headerTable.Rows.Add(new OrderedDictionary { { "RowIndex", 1 }, { "ColumnIndex", 1 }, { "ColumnName", "Sync Rule Scoping Condition" }, { "RowSpan", 1 }, { "ColSpan", 1 }, { "ColWidth", 10 } }.Values.Cast().ToArray()); // Inbound Expression - headerTable.Rows.Add(new OrderedDictionary { { "RowIndex", 1 }, { "ColumnIndex", 2 }, { "ColumnName", "Inbound Expression" }, { "RowSpan", 1 }, { "ColSpan", 1 }, { "ColWidth", 10 } }.Values.Cast().ToArray()); + headerTable.Rows.Add(new OrderedDictionary { { "RowIndex", 1 }, { "ColumnIndex", 2 }, { "ColumnName", "Expression" }, { "RowSpan", 1 }, { "ColSpan", 1 }, { "ColWidth", 10 } }.Values.Cast().ToArray()); // Inbound Flow Type - headerTable.Rows.Add(new OrderedDictionary { { "RowIndex", 1 }, { "ColumnIndex", 3 }, { "ColumnName", "Inbound Flow Type" }, { "RowSpan", 1 }, { "ColSpan", 1 }, { "ColWidth", 10 } }.Values.Cast().ToArray()); + headerTable.Rows.Add(new OrderedDictionary { { "RowIndex", 1 }, { "ColumnIndex", 3 }, { "ColumnName", "Flow Type" }, { "RowSpan", 1 }, { "ColSpan", 1 }, { "ColWidth", 6 } }.Values.Cast().ToArray()); + + // Inbound Precedence + headerTable.Rows.Add(new OrderedDictionary { { "RowIndex", 1 }, { "ColumnIndex", 4 }, { "ColumnName", "Rank" }, { "RowSpan", 1 }, { "ColSpan", 1 }, { "ColWidth", 5 } }.Values.Cast().ToArray()); // Inbound Arrow - headerTable.Rows.Add(new OrderedDictionary { { "RowIndex", 1 }, { "ColumnIndex", 4 }, { "ColumnName", "→" }, { "RowSpan", 1 }, { "ColSpan", 1 }, { "ColWidth", 2 } }.Values.Cast().ToArray()); + headerTable.Rows.Add(new OrderedDictionary { { "RowIndex", 1 }, { "ColumnIndex", 5 }, { "ColumnName", "→" }, { "RowSpan", 1 }, { "ColSpan", 1 }, { "ColWidth", 2 } }.Values.Cast().ToArray()); // Metaverse attribute - headerTable.Rows.Add(new OrderedDictionary { { "RowIndex", 1 }, { "ColumnIndex", 5 }, { "ColumnName", "Metaverse Attribute" }, { "RowSpan", 1 }, { "ColSpan", 1 }, { "ColWidth", 8 } }.Values.Cast().ToArray()); + headerTable.Rows.Add(new OrderedDictionary { { "RowIndex", 1 }, { "ColumnIndex", 6 }, { "ColumnName", "MV Attribute" }, { "RowSpan", 1 }, { "ColSpan", 1 }, { "ColWidth", 8 } }.Values.Cast().ToArray()); // Metaverse Object Type - headerTable.Rows.Add(new OrderedDictionary { { "RowIndex", 1 }, { "ColumnIndex", 6 }, { "ColumnName", "Metaverse Object Type" }, { "RowSpan", 1 }, { "ColSpan", 1 }, { "ColWidth", 8 } }.Values.Cast().ToArray()); + headerTable.Rows.Add(new OrderedDictionary { { "RowIndex", 1 }, { "ColumnIndex", 7 }, { "ColumnName", "MV Object Type" }, { "RowSpan", 1 }, { "ColSpan", 1 }, { "ColWidth", 5 } }.Values.Cast().ToArray()); // Outbound Arrow - headerTable.Rows.Add(new OrderedDictionary { { "RowIndex", 1 }, { "ColumnIndex", 7 }, { "ColumnName", "→" }, { "RowSpan", 1 }, { "ColSpan", 1 }, { "ColWidth", 2 } }.Values.Cast().ToArray()); + headerTable.Rows.Add(new OrderedDictionary { { "RowIndex", 1 }, { "ColumnIndex", 8 }, { "ColumnName", "→" }, { "RowSpan", 1 }, { "ColSpan", 1 }, { "ColWidth", 2 } }.Values.Cast().ToArray()); + + // Outbound Precedence + headerTable.Rows.Add(new OrderedDictionary { { "RowIndex", 1 }, { "ColumnIndex", 9 }, { "ColumnName", "Rank" }, { "RowSpan", 1 }, { "ColSpan", 1 }, { "ColWidth", 5 } }.Values.Cast().ToArray()); // Outbound Connector Name - headerTable.Rows.Add(new OrderedDictionary { { "RowIndex", 1 }, { "ColumnIndex", 8 }, { "ColumnName", "Outbound Connector" }, { "RowSpan", 1 }, { "ColSpan", 1 }, { "ColWidth", 10 } }.Values.Cast().ToArray()); + headerTable.Rows.Add(new OrderedDictionary { { "RowIndex", 1 }, { "ColumnIndex", 10 }, { "ColumnName", "Connector" }, { "RowSpan", 1 }, { "ColSpan", 1 }, { "ColWidth", 10 } }.Values.Cast().ToArray()); // Outbound Sync Rule Name - headerTable.Rows.Add(new OrderedDictionary { { "RowIndex", 1 }, { "ColumnIndex", 9 }, { "ColumnName", "Outbound Sync Rule" }, { "RowSpan", 1 }, { "ColSpan", 1 }, { "ColWidth", 10 } }.Values.Cast().ToArray()); + headerTable.Rows.Add(new OrderedDictionary { { "RowIndex", 1 }, { "ColumnIndex", 11 }, { "ColumnName", "Sync Rule" }, { "RowSpan", 1 }, { "ColSpan", 1 }, { "ColWidth", 10 } }.Values.Cast().ToArray()); // Outbound Sync Rule Scoping Condition String - headerTable.Rows.Add(new OrderedDictionary { { "RowIndex", 1 }, { "ColumnIndex", 10 }, { "ColumnName", "Outbound Sync Rule Scoping Condition" }, { "RowSpan", 1 }, { "ColSpan", 1 }, { "ColWidth", 10 } }.Values.Cast().ToArray()); + headerTable.Rows.Add(new OrderedDictionary { { "RowIndex", 1 }, { "ColumnIndex", 12 }, { "ColumnName", "Sync Rule Scoping Condition" }, { "RowSpan", 1 }, { "ColSpan", 1 }, { "ColWidth", 10 } }.Values.Cast().ToArray()); // Outbound Object Type - headerTable.Rows.Add(new OrderedDictionary { { "RowIndex", 1 }, { "ColumnIndex", 11 }, { "ColumnName", "Outbound Object Type" }, { "RowSpan", 1 }, { "ColSpan", 1 }, { "ColWidth", 10 } }.Values.Cast().ToArray()); + headerTable.Rows.Add(new OrderedDictionary { { "RowIndex", 1 }, { "ColumnIndex", 13 }, { "ColumnName", "Object Type" }, { "RowSpan", 1 }, { "ColSpan", 1 }, { "ColWidth", 5 } }.Values.Cast().ToArray()); // Outbound Flow Type - headerTable.Rows.Add(new OrderedDictionary { { "RowIndex", 1 }, { "ColumnIndex", 12 }, { "ColumnName", "Outbound Flow Type" }, { "RowSpan", 1 }, { "ColSpan", 1 }, { "ColWidth", 10 } }.Values.Cast().ToArray()); + headerTable.Rows.Add(new OrderedDictionary { { "RowIndex", 1 }, { "ColumnIndex", 14 }, { "ColumnName", "Flow Type" }, { "RowSpan", 1 }, { "ColSpan", 1 }, { "ColWidth", 6 } }.Values.Cast().ToArray()); // Outbound Expression - headerTable.Rows.Add(new OrderedDictionary { { "RowIndex", 1 }, { "ColumnIndex", 13 }, { "ColumnName", "Outbound Expression" }, { "RowSpan", 1 }, { "ColSpan", 1 }, { "ColWidth", 10 } }.Values.Cast().ToArray()); + headerTable.Rows.Add(new OrderedDictionary { { "RowIndex", 1 }, { "ColumnIndex", 15 }, { "ColumnName", "Expression" }, { "RowSpan", 1 }, { "ColSpan", 1 }, { "ColWidth", 10 } }.Values.Cast().ToArray()); // Target Attribute - headerTable.Rows.Add(new OrderedDictionary { { "RowIndex", 1 }, { "ColumnIndex", 14 }, { "ColumnName", "Target Attribute" }, { "RowSpan", 1 }, { "ColSpan", 1 }, { "ColWidth", 10 } }.Values.Cast().ToArray()); + headerTable.Rows.Add(new OrderedDictionary { { "RowIndex", 1 }, { "ColumnIndex", 16 }, { "ColumnName", "Target Attribute" }, { "RowSpan", 1 }, { "ColSpan", 1 }, { "ColWidth", 7 } }.Values.Cast().ToArray()); headerTable.AcceptChanges(); @@ -1719,25 +1754,33 @@ protected void CreateConnectorObjectExportAttributeFlowsSummaryDataSets() { Logger.Instance.WriteMethodEntry(); //columns and order - //inboundSyncRuleName, inboundSyncRuleScopingConditionString, inboundExpression, inboundFlowType, inboundArrow, metaverseAttribute, metaverseObjectType, outboundArrow, outboundConnectorName, outboundSyncRuleName, outboundSyncRuleScopingConditionString, outboundObjectType, outboundExpression, outboundFlowType, targetAttribute + //inboundSyncRuleName, inboundSyncRuleGuid inboundSyncRuleScopingConditionString, inboundExpression, inboundFlowType, inboundPrecedence, inboundArrow, metaverseAttribute, metaverseObjectType, outboundArrow, outboundPrecedence, outboundConnectorName, outboundConnectorGuid, outboundSyncRuleName, outboundSyncRuleGuid outboundSyncRuleScopingConditionString, outboundObjectType, outboundFlowType, outboundExpression, targetAttribute try { var table = new DataTable("ExportSummary") { Locale = CultureInfo.InvariantCulture }; var column1 = new DataColumn("inboundSyncRuleName"); - var column2 = new DataColumn("inboundSyncRuleScopingConditionString"); - var column3 = new DataColumn("inboundExpression"); - var column4 = new DataColumn("inboundFlowType"); - var column5 = new DataColumn("inboundArrow"); - var column6 = new DataColumn("metaverseAttribute"); - var column7 = new DataColumn("metaverseObjectType"); - var column8 = new DataColumn("outboundArrow"); - var column9 = new DataColumn("outboundConnectorName"); - var column10 = new DataColumn("outboundSyncRuleName"); - var column11 = new DataColumn("outboundSyncRuleScopingConditionString"); - var column12 = new DataColumn("outboundObjectType"); - var column13 = new DataColumn("outboundExpression"); - var column14 = new DataColumn("outboundFlowType"); - var column15 = new DataColumn("targetAttribute"); + //required for bookmarks + var column2 = new DataColumn("inboundSyncRuleGuid"); + var column3 = new DataColumn("inboundSyncRuleScopingConditionString"); + var column4 = new DataColumn("inboundExpression"); + var column5 = new DataColumn("inboundFlowType"); + var column6 = new DataColumn("inboundPrecedence"); + var column7 = new DataColumn("inboundArrow"); + var column8 = new DataColumn("metaverseAttribute"); + var column9 = new DataColumn("metaverseObjectType"); + var column10 = new DataColumn("outboundArrow"); + var column11 = new DataColumn("outboundPrecedence"); + var column12 = new DataColumn("outboundConnectorName"); + //required for bookmarks + var column13 = new DataColumn("outboundConnectorGuid"); + var column14 = new DataColumn("outboundSyncRuleName"); + //required for bookmarks + var column15 = new DataColumn("outboundSyncRuleGuid"); + var column16 = new DataColumn("outboundSyncRuleScopingConditionString"); + var column17 = new DataColumn("outboundObjectType"); + var column18 = new DataColumn("outboundExpression"); + var column19 = new DataColumn("outboundFlowType"); + var column20 = new DataColumn("targetAttribute"); table.Columns.Add(column1); table.Columns.Add(column2); @@ -1754,7 +1797,12 @@ protected void CreateConnectorObjectExportAttributeFlowsSummaryDataSets() table.Columns.Add(column13); table.Columns.Add(column14); table.Columns.Add(column15); - table.PrimaryKey = new[] { column1, column2, column3, column4, column5, column6, column7, column8, column9, column10, column11, column12, column13, column14, column15 }; + table.Columns.Add(column16); + table.Columns.Add(column17); + table.Columns.Add(column18); + table.Columns.Add(column19); + table.Columns.Add(column20); + table.PrimaryKey = new[] { column1, column2, column3, column4, column5, column6, column7, column8, column9, column10, column11, column12, column13, column14, column15, column16, column17, column18, column19, column20 }; this.PilotDataSet = new DataSet("ExportAttributeFlowsSummary") { Locale = CultureInfo.InvariantCulture }; this.PilotDataSet.Tables.Add(table); @@ -1782,52 +1830,67 @@ protected DataTable GetConnectorObjectExportAttributeFlowsSummaryPrintTable() { var printTable = Documenter.GetPrintTable(); //columns and order - //inboundSyncRuleName, inboundSyncRuleScopingConditionString, inboundExpression, inboundFlowType, inboundArrow, metaverseAttribute, metaverseObjectType, outboundArrow, outboundConnectorName, outboundSyncRuleName, outboundSyncRuleScopingConditionString, outboundObjectType, outboundExpression, outboundFlowType,targetAttribute + //inboundSyncRuleName, inboundSyncRuleGuid, inboundSyncRuleScopingConditionString, inboundExpression, inboundFlowType, inboundPrecedence, inboundArrow, metaverseAttribute, metaverseObjectType, outboundArrow, outboundPrecedence, outboundConnectorName, outboundConnectorGuid, outboundSyncRuleName, outboundSyncRuleGuid, outboundSyncRuleScopingConditionString, outboundObjectType, outboundFlowType, outboundExpression, targetAttribute // Inbound Sync Rule Name - printTable.Rows.Add(new OrderedDictionary { { "TableIndex", 0 }, { "ColumnIndex", 0 }, { "Hidden", false }, { "SortOrder", -1 }, { "BookmarkIndex", -1 }, { "JumpToBookmarkIndex", 5 }, { "ChangeIgnored", false } }.Values.Cast().ToArray()); + printTable.Rows.Add(new OrderedDictionary { { "TableIndex", 0 }, { "ColumnIndex", 0 }, { "Hidden", false }, { "SortOrder", -1 }, { "BookmarkIndex", -1 }, { "JumpToBookmarkIndex", 1 }, { "ChangeIgnored", false } }.Values.Cast().ToArray()); + + // Inbound Sync Rule Guid - required for bookmarks + printTable.Rows.Add(new OrderedDictionary { { "TableIndex", 0 }, { "ColumnIndex", 1 }, { "Hidden", true }, { "SortOrder", -1 }, { "BookmarkIndex", -1 }, { "JumpToBookmarkIndex", -1 }, { "ChangeIgnored", false } }.Values.Cast().ToArray()); // Inbound Sync Rule Scoping Condition String - printTable.Rows.Add(new OrderedDictionary { { "TableIndex", 0 }, { "ColumnIndex", 1 }, { "Hidden", false }, { "SortOrder", -1 }, { "BookmarkIndex", -1 }, { "JumpToBookmarkIndex", -1 }, { "ChangeIgnored", false } }.Values.Cast().ToArray()); + printTable.Rows.Add(new OrderedDictionary { { "TableIndex", 0 }, { "ColumnIndex", 2 }, { "Hidden", false }, { "SortOrder", -1 }, { "BookmarkIndex", -1 }, { "JumpToBookmarkIndex", -1 }, { "ChangeIgnored", false } }.Values.Cast().ToArray()); // Inbound Expression - printTable.Rows.Add(new OrderedDictionary { { "TableIndex", 0 }, { "ColumnIndex", 2 }, { "Hidden", false }, { "SortOrder", -1 }, { "BookmarkIndex", -1 }, { "JumpToBookmarkIndex", -1 }, { "ChangeIgnored", false } }.Values.Cast().ToArray()); + printTable.Rows.Add(new OrderedDictionary { { "TableIndex", 0 }, { "ColumnIndex", 3 }, { "Hidden", false }, { "SortOrder", -1 }, { "BookmarkIndex", -1 }, { "JumpToBookmarkIndex", -1 }, { "ChangeIgnored", false } }.Values.Cast().ToArray()); // Inbound Flow Type - printTable.Rows.Add(new OrderedDictionary { { "TableIndex", 0 }, { "ColumnIndex", 3 }, { "Hidden", false }, { "SortOrder", -1 }, { "BookmarkIndex", -1 }, { "JumpToBookmarkIndex", -1 }, { "ChangeIgnored", true } }.Values.Cast().ToArray()); + printTable.Rows.Add(new OrderedDictionary { { "TableIndex", 0 }, { "ColumnIndex", 4 }, { "Hidden", false }, { "SortOrder", -1 }, { "BookmarkIndex", -1 }, { "JumpToBookmarkIndex", -1 }, { "ChangeIgnored", true } }.Values.Cast().ToArray()); + + // Inbound Precedence + printTable.Rows.Add(new OrderedDictionary { { "TableIndex", 0 }, { "ColumnIndex", 5 }, { "Hidden", false }, { "SortOrder", -1 }, { "BookmarkIndex", -1 }, { "JumpToBookmarkIndex", -1 }, { "ChangeIgnored", true } }.Values.Cast().ToArray()); // Inbound Arrow - printTable.Rows.Add(new OrderedDictionary { { "TableIndex", 0 }, { "ColumnIndex", 4 }, { "Hidden", false }, { "SortOrder", -1 }, { "BookmarkIndex", -1 }, { "JumpToBookmarkIndex", -1 }, { "ChangeIgnored", true } }.Values.Cast().ToArray()); + printTable.Rows.Add(new OrderedDictionary { { "TableIndex", 0 }, { "ColumnIndex", 6 }, { "Hidden", false }, { "SortOrder", -1 }, { "BookmarkIndex", -1 }, { "JumpToBookmarkIndex", -1 }, { "ChangeIgnored", true } }.Values.Cast().ToArray()); // Metaverse Attribute - printTable.Rows.Add(new OrderedDictionary { { "TableIndex", 0 }, { "ColumnIndex", 5 }, { "Hidden", false }, { "SortOrder", 0 }, { "BookmarkIndex", -1 }, { "JumpToBookmarkIndex", -1 }, { "ChangeIgnored", false } }.Values.Cast().ToArray()); + printTable.Rows.Add(new OrderedDictionary { { "TableIndex", 0 }, { "ColumnIndex", 7 }, { "Hidden", false }, { "SortOrder", 0 }, { "BookmarkIndex", -1 }, { "JumpToBookmarkIndex", -1 }, { "ChangeIgnored", false } }.Values.Cast().ToArray()); // Metaverse Object Type - printTable.Rows.Add(new OrderedDictionary { { "TableIndex", 0 }, { "ColumnIndex", 6 }, { "Hidden", false }, { "SortOrder", 0 }, { "BookmarkIndex", -1 }, { "JumpToBookmarkIndex", -1 }, { "ChangeIgnored", false } }.Values.Cast().ToArray()); + printTable.Rows.Add(new OrderedDictionary { { "TableIndex", 0 }, { "ColumnIndex", 8 }, { "Hidden", false }, { "SortOrder", 0 }, { "BookmarkIndex", -1 }, { "JumpToBookmarkIndex", -1 }, { "ChangeIgnored", false } }.Values.Cast().ToArray()); // Outbound Arrow - printTable.Rows.Add(new OrderedDictionary { { "TableIndex", 0 }, { "ColumnIndex", 7 }, { "Hidden", false }, { "SortOrder", -1 }, { "BookmarkIndex", -1 }, { "JumpToBookmarkIndex", -1 }, { "ChangeIgnored", true } }.Values.Cast().ToArray()); + printTable.Rows.Add(new OrderedDictionary { { "TableIndex", 0 }, { "ColumnIndex", 9 }, { "Hidden", false }, { "SortOrder", -1 }, { "BookmarkIndex", -1 }, { "JumpToBookmarkIndex", -1 }, { "ChangeIgnored", true } }.Values.Cast().ToArray()); + + // Outbound Precedence + printTable.Rows.Add(new OrderedDictionary { { "TableIndex", 0 }, { "ColumnIndex", 10 }, { "Hidden", false }, { "SortOrder", -1 }, { "BookmarkIndex", -1 }, { "JumpToBookmarkIndex", -1 }, { "ChangeIgnored", false } }.Values.Cast().ToArray()); // Outbound Connector Name - printTable.Rows.Add(new OrderedDictionary { { "TableIndex", 0 }, { "ColumnIndex", 8 }, { "Hidden", false }, { "SortOrder", -1 }, { "BookmarkIndex", -1 }, { "JumpToBookmarkIndex", 8 }, { "ChangeIgnored", false } }.Values.Cast().ToArray()); + printTable.Rows.Add(new OrderedDictionary { { "TableIndex", 0 }, { "ColumnIndex", 11 }, { "Hidden", false }, { "SortOrder", -1 }, { "BookmarkIndex", -1 }, { "JumpToBookmarkIndex", 12 }, { "ChangeIgnored", false } }.Values.Cast().ToArray()); + + // Outbound Connector Guid - required for bookmarks + printTable.Rows.Add(new OrderedDictionary { { "TableIndex", 0 }, { "ColumnIndex", 12 }, { "Hidden", true }, { "SortOrder", -1 }, { "BookmarkIndex", -1 }, { "JumpToBookmarkIndex", -1 }, { "ChangeIgnored", false } }.Values.Cast().ToArray()); // Outbound Sync Rule Name - printTable.Rows.Add(new OrderedDictionary { { "TableIndex", 0 }, { "ColumnIndex", 9 }, { "Hidden", false }, { "SortOrder", -1 }, { "BookmarkIndex", -1 }, { "JumpToBookmarkIndex", 9 }, { "ChangeIgnored", false } }.Values.Cast().ToArray()); + printTable.Rows.Add(new OrderedDictionary { { "TableIndex", 0 }, { "ColumnIndex", 13 }, { "Hidden", false }, { "SortOrder", -1 }, { "BookmarkIndex", -1 }, { "JumpToBookmarkIndex", 14 }, { "ChangeIgnored", false } }.Values.Cast().ToArray()); + + // Outbound Sync Rule Guid - required for bookmarks + printTable.Rows.Add(new OrderedDictionary { { "TableIndex", 0 }, { "ColumnIndex", 14 }, { "Hidden", true }, { "SortOrder", -1 }, { "BookmarkIndex", -1 }, { "JumpToBookmarkIndex", -1 }, { "ChangeIgnored", false } }.Values.Cast().ToArray()); // Outbound Sync Rule Scoping Condition String - printTable.Rows.Add(new OrderedDictionary { { "TableIndex", 0 }, { "ColumnIndex", 10 }, { "Hidden", false }, { "SortOrder", -1 }, { "BookmarkIndex", -1 }, { "JumpToBookmarkIndex", -1 }, { "ChangeIgnored", false } }.Values.Cast().ToArray()); + printTable.Rows.Add(new OrderedDictionary { { "TableIndex", 0 }, { "ColumnIndex", 15 }, { "Hidden", false }, { "SortOrder", -1 }, { "BookmarkIndex", -1 }, { "JumpToBookmarkIndex", -1 }, { "ChangeIgnored", false } }.Values.Cast().ToArray()); // Outbound Object Type - printTable.Rows.Add(new OrderedDictionary { { "TableIndex", 0 }, { "ColumnIndex", 11 }, { "Hidden", false }, { "SortOrder", -1 }, { "BookmarkIndex", -1 }, { "JumpToBookmarkIndex", -1 }, { "ChangeIgnored", false } }.Values.Cast().ToArray()); + printTable.Rows.Add(new OrderedDictionary { { "TableIndex", 0 }, { "ColumnIndex", 16 }, { "Hidden", false }, { "SortOrder", -1 }, { "BookmarkIndex", -1 }, { "JumpToBookmarkIndex", -1 }, { "ChangeIgnored", false } }.Values.Cast().ToArray()); // Outbound Expression - printTable.Rows.Add(new OrderedDictionary { { "TableIndex", 0 }, { "ColumnIndex", 12 }, { "Hidden", false }, { "SortOrder", -1 }, { "BookmarkIndex", -1 }, { "JumpToBookmarkIndex", -1 }, { "ChangeIgnored", false } }.Values.Cast().ToArray()); + printTable.Rows.Add(new OrderedDictionary { { "TableIndex", 0 }, { "ColumnIndex", 17 }, { "Hidden", false }, { "SortOrder", -1 }, { "BookmarkIndex", -1 }, { "JumpToBookmarkIndex", -1 }, { "ChangeIgnored", false } }.Values.Cast().ToArray()); // Outbound Flow Type - printTable.Rows.Add(new OrderedDictionary { { "TableIndex", 0 }, { "ColumnIndex", 13 }, { "Hidden", false }, { "SortOrder", -1 }, { "BookmarkIndex", -1 }, { "JumpToBookmarkIndex", -1 }, { "ChangeIgnored", true } }.Values.Cast().ToArray()); + printTable.Rows.Add(new OrderedDictionary { { "TableIndex", 0 }, { "ColumnIndex", 18 }, { "Hidden", false }, { "SortOrder", -1 }, { "BookmarkIndex", -1 }, { "JumpToBookmarkIndex", -1 }, { "ChangeIgnored", true } }.Values.Cast().ToArray()); // Target Attribute - printTable.Rows.Add(new OrderedDictionary { { "TableIndex", 0 }, { "ColumnIndex", 14 }, { "Hidden", false }, { "SortOrder", -1 }, { "BookmarkIndex", -1 }, { "JumpToBookmarkIndex", -1 }, { "ChangeIgnored", false } }.Values.Cast().ToArray()); + printTable.Rows.Add(new OrderedDictionary { { "TableIndex", 0 }, { "ColumnIndex", 19 }, { "Hidden", false }, { "SortOrder", -1 }, { "BookmarkIndex", -1 }, { "JumpToBookmarkIndex", -1 }, { "ChangeIgnored", false } }.Values.Cast().ToArray()); printTable.AcceptChanges(); @@ -1847,7 +1910,7 @@ protected void FillConnectorObjectExportAttributeFlowsSummary(bool pilotConfig) { Logger.Instance.WriteMethodEntry("Pilot Config: '{0}'.", pilotConfig); //columns and order - //inboundSyncRuleName, inboundSyncRuleScopingConditionString, inboundExpression, inboundFlowType, inboundArrow, metaverseAttribute, metaverseObjectType, outboundArrow, outboundConnectorName, outboundSyncRuleName, outboundSyncRuleScopingConditionString, outboundObjectType, outboundExpression, outboundFlowType, targetAttribute + //inboundSyncRuleName, inboundSyncRuleGuid, inboundSyncRuleScopingConditionString, inboundExpression, inboundFlowType, inboundPrecedence, inboundArrow, metaverseAttribute, metaverseObjectType, outboundArrow, outboundPrecedence, outboundConnectorName, outboundConnectorGuid, outboundSyncRuleName, outboundSyncRuleGuid, outboundSyncRuleScopingConditionString, outboundObjectType, outboundFlowType, outboundExpression, targetAttribute try { @@ -1866,11 +1929,8 @@ protected void FillConnectorObjectExportAttributeFlowsSummary(bool pilotConfig) let dest = (string)outboundSyncRuleDestination orderby dest select dest; - //foreach (var metaverseAttribute in metaverseAttributes.Distinct()) foreach (var metaverseAttribute in metaverseAttributes.Distinct()) { - //Documenter.AddRow(table, new object[] { metaverseAttribute, "←" }); - // Outbound metaverse flows var outboundSyncRules = config.XPathSelectElements(Documenter.GetSynchronizationRuleXmlRootXPath(pilotConfig) + "/synchronizationRule[direction = 'Outbound' " + Documenter.SyncRuleDisabledCondition + " and targetObjectType = '" + this.currentDataSourceObjectType + "' and (attribute-mappings/mapping/src/attr = '" + metaverseAttribute + "' or contains(attribute-mappings/mapping/expression, '[" + metaverseAttribute + "]'))]"); outboundSyncRules = from syncRule in outboundSyncRules @@ -1929,12 +1989,14 @@ orderby inboundSyncRulePrecedence string inboundExpression = ""; string inboundSyncRuleScopingConditionString = ""; string inboundFlowType = ""; + string inboundPrecedence = ""; if (inboundSyncRules.ElementAtOrDefault(i) != null) { inboundSyncRuleName = (string)inboundSyncRules.ElementAt(i).Element("name"); inboundSyncRuleGuid = (string)inboundSyncRules.ElementAt(i).Element("id"); metaverseObjectType = (string)inboundSyncRules.ElementAt(i).Element("targetObjectType"); + inboundPrecedence = (string)inboundSyncRules.ElementAt(i).Element("precedence"); ++inboundSyncRuleRank; if (inboundSyncRules.ElementAt(i).XPathSelectElements("./attribute-mappings/mapping[dest = '" + metaverseAttribute + "']").Count() > 1) { @@ -1976,6 +2038,7 @@ orderby inboundSyncRulePrecedence string outboundSyncRuleScopingCondition = ""; string outboundObjectType = ""; string outboundFlowType = ""; + string outboundPrecedence = ""; if (outboundSyncRules.ElementAtOrDefault(i) != null) { @@ -1984,6 +2047,7 @@ orderby inboundSyncRulePrecedence metaverseObjectType = (string)outboundSyncRules.ElementAt(i).Element("sourceObjectType"); outboundConnectorGuid = ((string)outboundSyncRules.ElementAt(i).Element("connector") ?? string.Empty).ToUpperInvariant(); outboundObjectType = (string)outboundSyncRules.ElementAt(i).Element("targetObjectType"); + outboundPrecedence = (string)outboundSyncRules.ElementAt(i).Element("precedence"); outboundConnectorName = (string)config.XPathSelectElement(Documenter.GetConnectorXmlRootXPath(pilotConfig) + "/ma-data[translate(id, '" + Documenter.LowercaseLetters + "', '" + Documenter.UppercaseLetters + "') = '" + outboundConnectorGuid + "']/name"); if (string.IsNullOrEmpty(outboundConnectorName)) { @@ -2025,8 +2089,8 @@ orderby inboundSyncRulePrecedence } } //columns and order - //inboundSyncRuleName, inboundSyncRuleScopingConditionString, inboundExpression, inboundFlowType, inboundArrow, metaverseAttribute, metaverseObjectType, outboundArrow, outboundConnectorName, outboundSyncRuleName, outboundSyncRuleScopingConditionString, outboundObjectType, outboundExpression, outboundFlowType, targetAttribute - Documenter.AddRow(table, new object[] { inboundSyncRuleName, inboundSyncRuleScopingConditionString, inboundExpression, inboundFlowType, "→", metaverseAttribute, metaverseObjectType, "→", outboundConnectorName, outboundSyncRuleName, outboundSyncRuleScopingCondition, outboundObjectType, outboundExpression, outboundFlowType, targetAttribute }); + //inboundSyncRuleName, inboundSyncRuleGuid, inboundSyncRuleScopingConditionString, inboundExpression, inboundFlowType, inboundPrecedence, inboundArrow, metaverseAttribute, metaverseObjectType, outboundArrow, outboundPrecedence, outboundConnectorName, outboundConnectorGuid, outboundSyncRuleName, outboundSyncRuleGuid, outboundSyncRuleScopingConditionString, outboundObjectType, outboundFlowType, outboundExpression, targetAttribute + Documenter.AddRow(table, new object[] { inboundSyncRuleName, inboundSyncRuleGuid, inboundSyncRuleScopingConditionString, inboundExpression, inboundFlowType, inboundPrecedence, "→", metaverseAttribute, metaverseObjectType, "→", outboundPrecedence, outboundConnectorName, outboundConnectorGuid, outboundSyncRuleName, outboundSyncRuleGuid, outboundSyncRuleScopingCondition, outboundObjectType, outboundExpression, outboundFlowType, targetAttribute }); } } } @@ -2071,64 +2135,71 @@ protected DataTable GetConnectorObjectExportAttributeFlowsSummaryHeaderTable() { var headerTable = Documenter.GetHeaderTable(); - //columns and order - //inboundSyncRuleName, inboundSyncRuleScopingConditionString, inboundExpression, inboundFlowType, inboundArrow, metaverseAttribute, metaverseObjectType, outboundArrow, outboundConnectorName, outboundSyncRuleName, outboundSyncRuleScopingConditionString, outboundObjectType, outboundFlowType, outboundExpression, targetAttribute - + //columns and order - doesn't include hidden GUID columns + //inboundSyncRuleName, inboundSyncRuleScopingConditionString, inboundExpression, inboundFlowType, inboundPrecedence, inboundArrow, metaverseAttribute, metaverseObjectType, outboundArrow, outboundPrecedence, outboundConnectorName, outboundSyncRuleName, outboundSyncRuleScopingConditionString, outboundObjectType, outboundFlowType, outboundExpression, targetAttribute + //colWidths + //10 + 1 + 10 + 6 + 5 + 2 + 8 + 5 + 2 + 5 + 10 + 10 + 1 + 5 + 6 + 10 + 7 // Header Row 1 // Import Flows - headerTable.Rows.Add(new OrderedDictionary { { "RowIndex", 0 }, { "ColumnIndex", 0 }, { "ColumnName", "Import Flows" }, { "RowSpan", 1 }, { "ColSpan", 5 }, { "ColWidth", 0 } }.Values.Cast().ToArray()); + headerTable.Rows.Add(new OrderedDictionary { { "RowIndex", 0 }, { "ColumnIndex", 0 }, { "ColumnName", "Import Flows" }, { "RowSpan", 1 }, { "ColSpan", 6 }, { "ColWidth", 0 } }.Values.Cast().ToArray()); // MV Attribute headerTable.Rows.Add(new OrderedDictionary { { "RowIndex", 0 }, { "ColumnIndex", 1 }, { "ColumnName", "Metaverse" }, { "RowSpan", 1 }, { "ColSpan", 3 }, { "ColWidth", 0 } }.Values.Cast().ToArray()); // Export Flows - headerTable.Rows.Add(new OrderedDictionary { { "RowIndex", 0 }, { "ColumnIndex", 2 }, { "ColumnName", "Export Flows" }, { "RowSpan", 1 }, { "ColSpan", 7 }, { "ColWidth", 0 } }.Values.Cast().ToArray()); + headerTable.Rows.Add(new OrderedDictionary { { "RowIndex", 0 }, { "ColumnIndex", 2 }, { "ColumnName", "Export Flows" }, { "RowSpan", 1 }, { "ColSpan", 9 }, { "ColWidth", 0 } }.Values.Cast().ToArray()); // Header Row 2 // Inbound Sync Rule Name - headerTable.Rows.Add(new OrderedDictionary { { "RowIndex", 1 }, { "ColumnIndex", 0 }, { "ColumnName", "Inbound Sync Rule" }, { "RowSpan", 1 }, { "ColSpan", 1 }, { "ColWidth", 10 } }.Values.Cast().ToArray()); + headerTable.Rows.Add(new OrderedDictionary { { "RowIndex", 1 }, { "ColumnIndex", 0 }, { "ColumnName", "Sync Rule" }, { "RowSpan", 1 }, { "ColSpan", 1 }, { "ColWidth", 10 } }.Values.Cast().ToArray()); // Inbound Sync Rule Scoping Condition String - headerTable.Rows.Add(new OrderedDictionary { { "RowIndex", 1 }, { "ColumnIndex", 1 }, { "ColumnName", "Inbound Sync Rule Scoping Condition" }, { "RowSpan", 1 }, { "ColSpan", 1 }, { "ColWidth", 10 } }.Values.Cast().ToArray()); + headerTable.Rows.Add(new OrderedDictionary { { "RowIndex", 1 }, { "ColumnIndex", 1 }, { "ColumnName", "Sync Rule Scoping Condition" }, { "RowSpan", 1 }, { "ColSpan", 1 }, { "ColWidth", 10 } }.Values.Cast().ToArray()); // Inbound Expression - headerTable.Rows.Add(new OrderedDictionary { { "RowIndex", 1 }, { "ColumnIndex", 2 }, { "ColumnName", "Inbound Expression" }, { "RowSpan", 1 }, { "ColSpan", 1 }, { "ColWidth", 10 } }.Values.Cast().ToArray()); + headerTable.Rows.Add(new OrderedDictionary { { "RowIndex", 1 }, { "ColumnIndex", 2 }, { "ColumnName", "Expression" }, { "RowSpan", 1 }, { "ColSpan", 1 }, { "ColWidth", 10 } }.Values.Cast().ToArray()); // Inbound Flow Type - headerTable.Rows.Add(new OrderedDictionary { { "RowIndex", 1 }, { "ColumnIndex", 3 }, { "ColumnName", "Inbound Flow Type" }, { "RowSpan", 1 }, { "ColSpan", 1 }, { "ColWidth", 10 } }.Values.Cast().ToArray()); + headerTable.Rows.Add(new OrderedDictionary { { "RowIndex", 1 }, { "ColumnIndex", 3 }, { "ColumnName", "Flow Type" }, { "RowSpan", 1 }, { "ColSpan", 1 }, { "ColWidth", 6 } }.Values.Cast().ToArray()); + + // Inbound Precedence + headerTable.Rows.Add(new OrderedDictionary { { "RowIndex", 1 }, { "ColumnIndex", 4 }, { "ColumnName", "Rank" }, { "RowSpan", 1 }, { "ColSpan", 1 }, { "ColWidth", 5 } }.Values.Cast().ToArray()); // Inbound Arrow - headerTable.Rows.Add(new OrderedDictionary { { "RowIndex", 1 }, { "ColumnIndex", 4 }, { "ColumnName", "→" }, { "RowSpan", 1 }, { "ColSpan", 1 }, { "ColWidth", 2 } }.Values.Cast().ToArray()); + headerTable.Rows.Add(new OrderedDictionary { { "RowIndex", 1 }, { "ColumnIndex", 5 }, { "ColumnName", "→" }, { "RowSpan", 1 }, { "ColSpan", 1 }, { "ColWidth", 2 } }.Values.Cast().ToArray()); // Metaverse attribute - headerTable.Rows.Add(new OrderedDictionary { { "RowIndex", 1 }, { "ColumnIndex", 5 }, { "ColumnName", "Metaverse Attribute" }, { "RowSpan", 1 }, { "ColSpan", 1 }, { "ColWidth", 8 } }.Values.Cast().ToArray()); + headerTable.Rows.Add(new OrderedDictionary { { "RowIndex", 1 }, { "ColumnIndex", 6 }, { "ColumnName", "MV Attribute" }, { "RowSpan", 1 }, { "ColSpan", 1 }, { "ColWidth", 8 } }.Values.Cast().ToArray()); // Metaverse Object Type - headerTable.Rows.Add(new OrderedDictionary { { "RowIndex", 1 }, { "ColumnIndex", 6 }, { "ColumnName", "Metaverse Object Type" }, { "RowSpan", 1 }, { "ColSpan", 1 }, { "ColWidth", 8 } }.Values.Cast().ToArray()); + headerTable.Rows.Add(new OrderedDictionary { { "RowIndex", 1 }, { "ColumnIndex", 7 }, { "ColumnName", "MV Object Type" }, { "RowSpan", 1 }, { "ColSpan", 1 }, { "ColWidth", 5 } }.Values.Cast().ToArray()); // Outbound Arrow - headerTable.Rows.Add(new OrderedDictionary { { "RowIndex", 1 }, { "ColumnIndex", 7 }, { "ColumnName", "→" }, { "RowSpan", 1 }, { "ColSpan", 1 }, { "ColWidth", 2 } }.Values.Cast().ToArray()); + headerTable.Rows.Add(new OrderedDictionary { { "RowIndex", 1 }, { "ColumnIndex", 8 }, { "ColumnName", "→" }, { "RowSpan", 1 }, { "ColSpan", 1 }, { "ColWidth", 2 } }.Values.Cast().ToArray()); + + // Outbound Precedence + headerTable.Rows.Add(new OrderedDictionary { { "RowIndex", 1 }, { "ColumnIndex", 9 }, { "ColumnName", "Rank" }, { "RowSpan", 1 }, { "ColSpan", 1 }, { "ColWidth", 5 } }.Values.Cast().ToArray()); // Outbound Connector Name - headerTable.Rows.Add(new OrderedDictionary { { "RowIndex", 1 }, { "ColumnIndex", 8 }, { "ColumnName", "Outbound Connector" }, { "RowSpan", 1 }, { "ColSpan", 1 }, { "ColWidth", 10 } }.Values.Cast().ToArray()); + headerTable.Rows.Add(new OrderedDictionary { { "RowIndex", 1 }, { "ColumnIndex", 10 }, { "ColumnName", "Connector" }, { "RowSpan", 1 }, { "ColSpan", 1 }, { "ColWidth", 10 } }.Values.Cast().ToArray()); // Outbound Sync Rule Name - headerTable.Rows.Add(new OrderedDictionary { { "RowIndex", 1 }, { "ColumnIndex", 9 }, { "ColumnName", "Outbound Sync Rule" }, { "RowSpan", 1 }, { "ColSpan", 1 }, { "ColWidth", 10 } }.Values.Cast().ToArray()); + headerTable.Rows.Add(new OrderedDictionary { { "RowIndex", 1 }, { "ColumnIndex", 11 }, { "ColumnName", "Sync Rule" }, { "RowSpan", 1 }, { "ColSpan", 1 }, { "ColWidth", 10 } }.Values.Cast().ToArray()); // Outbound Sync Rule Scoping Condition String - headerTable.Rows.Add(new OrderedDictionary { { "RowIndex", 1 }, { "ColumnIndex", 10 }, { "ColumnName", "Outbound Sync Rule Scoping Condition" }, { "RowSpan", 1 }, { "ColSpan", 1 }, { "ColWidth", 10 } }.Values.Cast().ToArray()); + headerTable.Rows.Add(new OrderedDictionary { { "RowIndex", 1 }, { "ColumnIndex", 12 }, { "ColumnName", "Sync Rule Scoping Condition" }, { "RowSpan", 1 }, { "ColSpan", 1 }, { "ColWidth", 10 } }.Values.Cast().ToArray()); // Outbound Object Type - headerTable.Rows.Add(new OrderedDictionary { { "RowIndex", 1 }, { "ColumnIndex", 11 }, { "ColumnName", "Outbound Object Type" }, { "RowSpan", 1 }, { "ColSpan", 1 }, { "ColWidth", 10 } }.Values.Cast().ToArray()); + headerTable.Rows.Add(new OrderedDictionary { { "RowIndex", 1 }, { "ColumnIndex", 13 }, { "ColumnName", "Object Type" }, { "RowSpan", 1 }, { "ColSpan", 1 }, { "ColWidth", 5 } }.Values.Cast().ToArray()); // Outbound Flow Type - headerTable.Rows.Add(new OrderedDictionary { { "RowIndex", 1 }, { "ColumnIndex", 12 }, { "ColumnName", "Outbound Flow Type" }, { "RowSpan", 1 }, { "ColSpan", 1 }, { "ColWidth", 10 } }.Values.Cast().ToArray()); + headerTable.Rows.Add(new OrderedDictionary { { "RowIndex", 1 }, { "ColumnIndex", 14 }, { "ColumnName", "Flow Type" }, { "RowSpan", 1 }, { "ColSpan", 1 }, { "ColWidth", 6 } }.Values.Cast().ToArray()); // Outbound Expression - headerTable.Rows.Add(new OrderedDictionary { { "RowIndex", 1 }, { "ColumnIndex", 13 }, { "ColumnName", "Outbound Expression" }, { "RowSpan", 1 }, { "ColSpan", 1 }, { "ColWidth", 10 } }.Values.Cast().ToArray()); + headerTable.Rows.Add(new OrderedDictionary { { "RowIndex", 1 }, { "ColumnIndex", 15 }, { "ColumnName", "Expression" }, { "RowSpan", 1 }, { "ColSpan", 1 }, { "ColWidth", 10 } }.Values.Cast().ToArray()); // Target Attribute - headerTable.Rows.Add(new OrderedDictionary { { "RowIndex", 1 }, { "ColumnIndex", 14 }, { "ColumnName", "Target Attribute" }, { "RowSpan", 1 }, { "ColSpan", 1 }, { "ColWidth", 10 } }.Values.Cast().ToArray()); + headerTable.Rows.Add(new OrderedDictionary { { "RowIndex", 1 }, { "ColumnIndex", 16 }, { "ColumnName", "Target Attribute" }, { "RowSpan", 1 }, { "ColSpan", 1 }, { "ColWidth", 7 } }.Values.Cast().ToArray()); headerTable.AcceptChanges(); From 5cb0c5d3d19e36bda67f3d28e71a0292942cccb4 Mon Sep 17 00:00:00 2001 From: FIMTooler <30675401+FIMTooler@users.noreply.github.com> Date: Fri, 26 Apr 2024 15:50:47 -0400 Subject: [PATCH 07/10] Update FlowType to include Constant --- .../ConnectorDocumenter.cs | 323 +++++++----------- 1 file changed, 129 insertions(+), 194 deletions(-) diff --git a/src/AzureADConnectSyncDocumenter/ConnectorDocumenter.cs b/src/AzureADConnectSyncDocumenter/ConnectorDocumenter.cs index 43b9cbb..0caab92 100644 --- a/src/AzureADConnectSyncDocumenter/ConnectorDocumenter.cs +++ b/src/AzureADConnectSyncDocumenter/ConnectorDocumenter.cs @@ -1,4 +1,4 @@ -//------------------------------------------------------------------------------------------------------------------------------------------ +//------------------------------------------------------------------------------------------------------------------------------------------ // // Copyright (c) Microsoft. All Rights Reserved. // Licensed under the MIT license. See LICENSE.txt file in the project root for full license information. @@ -1252,33 +1252,25 @@ protected void CreateConnectorObjectImportAttributeFlowsSummaryDataSets() { Logger.Instance.WriteMethodEntry(); //columns and order - //inboundSyncRuleName, inboundSyncRuleGuid inboundSyncRuleScopingConditionString, inboundExpression, inboundFlowType, inboundPrecedence, inboundArrow, metaverseAttribute, metaverseObjectType, outboundArrow, outboundPrecedence, outboundConnectorName, outboundConnectorGuid, outboundSyncRuleName, outboundSyncRuleGuid outboundSyncRuleScopingConditionString, outboundObjectType, outboundFlowType, outboundExpression, targetAttribute + //inboundSyncRuleName, inboundSyncRuleScopingConditionString, inboundExpression, inboundFlowType, inboundArrow, metaverseAttribute, metaverseObjectType, outboundArrow, outboundConnectorName, outboundSyncRuleName, outboundSyncRuleScopingConditionString, outboundObjectType, outboundExpression, outboundFlowType, targetAttribute try { - var table = new DataTable("customizedImportSummary") { Locale = CultureInfo.InvariantCulture }; + var table = new DataTable("ImportSummary") { Locale = CultureInfo.InvariantCulture }; var column1 = new DataColumn("inboundSyncRuleName"); - //required for bookmarks - var column2 = new DataColumn("inboundSyncRuleGuid"); - var column3 = new DataColumn("inboundSyncRuleScopingConditionString"); - var column4 = new DataColumn("inboundExpression"); - var column5 = new DataColumn("inboundFlowType"); - var column6 = new DataColumn("inboundPrecedence"); - var column7 = new DataColumn("inboundArrow"); - var column8 = new DataColumn("metaverseAttribute"); - var column9 = new DataColumn("metaverseObjectType"); - var column10 = new DataColumn("outboundArrow"); - var column11 = new DataColumn("outboundPrecedence"); - var column12 = new DataColumn("outboundConnectorName"); - //required for bookmarks - var column13 = new DataColumn("outboundConnectorGuid"); - var column14 = new DataColumn("outboundSyncRuleName"); - //required for bookmarks - var column15 = new DataColumn("outboundSyncRuleGuid"); - var column16 = new DataColumn("outboundSyncRuleScopingConditionString"); - var column17 = new DataColumn("outboundObjectType"); - var column18 = new DataColumn("outboundFlowType"); - var column19 = new DataColumn("outboundExpression"); - var column20 = new DataColumn("targetAttribute"); + var column2 = new DataColumn("inboundSyncRuleScopingConditionString"); + var column3 = new DataColumn("inboundExpression"); + var column4 = new DataColumn("inboundFlowType"); + var column5 = new DataColumn("inboundArrow"); + var column6 = new DataColumn("metaverseAttribute"); + var column7 = new DataColumn("metaverseObjectType"); + var column8 = new DataColumn("outboundArrow"); + var column9 = new DataColumn("outboundConnectorName"); + var column10 = new DataColumn("outboundSyncRuleName"); + var column11 = new DataColumn("outboundSyncRuleScopingConditionString"); + var column12 = new DataColumn("outboundObjectType"); + var column13 = new DataColumn("outboundExpression"); + var column14 = new DataColumn("outboundFlowType"); + var column15 = new DataColumn("targetAttribute"); table.Columns.Add(column1); table.Columns.Add(column2); @@ -1295,12 +1287,7 @@ protected void CreateConnectorObjectImportAttributeFlowsSummaryDataSets() table.Columns.Add(column13); table.Columns.Add(column14); table.Columns.Add(column15); - table.Columns.Add(column16); - table.Columns.Add(column17); - table.Columns.Add(column18); - table.Columns.Add(column19); - table.Columns.Add(column20); - table.PrimaryKey = new[] { column1, column2, column3, column4, column5, column6, column7, column8, column9, column10, column11, column12, column13, column14, column15, column16, column17, column18, column19, column20 }; + table.PrimaryKey = new[] { column1, column2, column3, column4, column5, column6, column7, column8, column9, column10, column11, column12, column13, column14, column15 }; this.PilotDataSet = new DataSet("ImportAttributeFlowsSummary") { Locale = CultureInfo.InvariantCulture }; this.PilotDataSet.Tables.Add(table); @@ -1328,67 +1315,52 @@ protected DataTable GetConnectorObjectImportAttributeFlowsSummaryPrintTable() { var printTable = Documenter.GetPrintTable(); //columns and order - //inboundSyncRuleName, inboundSyncRuleGuid inboundSyncRuleScopingConditionString, inboundExpression, inboundFlowType, inboundPrecedence, inboundArrow, metaverseAttribute, metaverseObjectType, outboundArrow, outboundPrecedence, outboundConnectorName, outboundConnectorGuid, outboundSyncRuleName, outboundSyncRuleGuid outboundSyncRuleScopingConditionString, outboundObjectType, outboundFlowType, outboundExpression, targetAttribute + //inboundSyncRuleName, inboundSyncRuleScopingConditionString, inboundExpression, inboundFlowType, inboundArrow, metaverseAttribute, metaverseObjectType, outboundArrow, outboundConnectorName, outboundSyncRuleName, outboundSyncRuleScopingConditionString, outboundObjectType, outboundExpression, outboundFlowType,targetAttribute // Inbound Sync Rule Name - printTable.Rows.Add(new OrderedDictionary { { "TableIndex", 0 }, { "ColumnIndex", 0 }, { "Hidden", false }, { "SortOrder", -1 }, { "BookmarkIndex", -1 }, { "JumpToBookmarkIndex", 1 }, { "ChangeIgnored", false } }.Values.Cast().ToArray()); - - // Inbound Sync Rule Guid - required for bookmarks - printTable.Rows.Add(new OrderedDictionary { { "TableIndex", 0 }, { "ColumnIndex", 1 }, { "Hidden", true }, { "SortOrder", -1 }, { "BookmarkIndex", -1 }, { "JumpToBookmarkIndex", -1 }, { "ChangeIgnored", false } }.Values.Cast().ToArray()); + printTable.Rows.Add(new OrderedDictionary { { "TableIndex", 0 }, { "ColumnIndex", 0 }, { "Hidden", false }, { "SortOrder", -1 }, { "BookmarkIndex", -1 }, { "JumpToBookmarkIndex", 5 }, { "ChangeIgnored", false } }.Values.Cast().ToArray()); // Inbound Sync Rule Scoping Condition String - printTable.Rows.Add(new OrderedDictionary { { "TableIndex", 0 }, { "ColumnIndex", 2 }, { "Hidden", false }, { "SortOrder", -1 }, { "BookmarkIndex", -1 }, { "JumpToBookmarkIndex", -1 }, { "ChangeIgnored", false } }.Values.Cast().ToArray()); + printTable.Rows.Add(new OrderedDictionary { { "TableIndex", 0 }, { "ColumnIndex", 1 }, { "Hidden", false }, { "SortOrder", -1 }, { "BookmarkIndex", -1 }, { "JumpToBookmarkIndex", -1 }, { "ChangeIgnored", false } }.Values.Cast().ToArray()); // Inbound Expression - printTable.Rows.Add(new OrderedDictionary { { "TableIndex", 0 }, { "ColumnIndex", 3 }, { "Hidden", false }, { "SortOrder", -1 }, { "BookmarkIndex", -1 }, { "JumpToBookmarkIndex", -1 }, { "ChangeIgnored", false } }.Values.Cast().ToArray()); + printTable.Rows.Add(new OrderedDictionary { { "TableIndex", 0 }, { "ColumnIndex", 2 }, { "Hidden", false }, { "SortOrder", -1 }, { "BookmarkIndex", -1 }, { "JumpToBookmarkIndex", -1 }, { "ChangeIgnored", false } }.Values.Cast().ToArray()); // Inbound Flow Type - printTable.Rows.Add(new OrderedDictionary { { "TableIndex", 0 }, { "ColumnIndex", 4 }, { "Hidden", false }, { "SortOrder", -1 }, { "BookmarkIndex", -1 }, { "JumpToBookmarkIndex", -1 }, { "ChangeIgnored", true } }.Values.Cast().ToArray()); - - // Inbound Precedence - printTable.Rows.Add(new OrderedDictionary { { "TableIndex", 0 }, { "ColumnIndex", 5 }, { "Hidden", false }, { "SortOrder", -1 }, { "BookmarkIndex", -1 }, { "JumpToBookmarkIndex", -1 }, { "ChangeIgnored", true } }.Values.Cast().ToArray()); + printTable.Rows.Add(new OrderedDictionary { { "TableIndex", 0 }, { "ColumnIndex", 3 }, { "Hidden", false }, { "SortOrder", -1 }, { "BookmarkIndex", -1 }, { "JumpToBookmarkIndex", -1 }, { "ChangeIgnored", true } }.Values.Cast().ToArray()); // Inbound Arrow - printTable.Rows.Add(new OrderedDictionary { { "TableIndex", 0 }, { "ColumnIndex", 6 }, { "Hidden", false }, { "SortOrder", -1 }, { "BookmarkIndex", -1 }, { "JumpToBookmarkIndex", -1 }, { "ChangeIgnored", true } }.Values.Cast().ToArray()); + printTable.Rows.Add(new OrderedDictionary { { "TableIndex", 0 }, { "ColumnIndex", 4 }, { "Hidden", false }, { "SortOrder", -1 }, { "BookmarkIndex", -1 }, { "JumpToBookmarkIndex", -1 }, { "ChangeIgnored", true } }.Values.Cast().ToArray()); // Metaverse Attribute - printTable.Rows.Add(new OrderedDictionary { { "TableIndex", 0 }, { "ColumnIndex", 7 }, { "Hidden", false }, { "SortOrder", 0 }, { "BookmarkIndex", -1 }, { "JumpToBookmarkIndex", -1 }, { "ChangeIgnored", false } }.Values.Cast().ToArray()); + printTable.Rows.Add(new OrderedDictionary { { "TableIndex", 0 }, { "ColumnIndex", 5 }, { "Hidden", false }, { "SortOrder", 0 }, { "BookmarkIndex", -1 }, { "JumpToBookmarkIndex", -1 }, { "ChangeIgnored", false } }.Values.Cast().ToArray()); // Metaverse Object Type - printTable.Rows.Add(new OrderedDictionary { { "TableIndex", 0 }, { "ColumnIndex", 8 }, { "Hidden", false }, { "SortOrder", 0 }, { "BookmarkIndex", -1 }, { "JumpToBookmarkIndex", -1 }, { "ChangeIgnored", false } }.Values.Cast().ToArray()); + printTable.Rows.Add(new OrderedDictionary { { "TableIndex", 0 }, { "ColumnIndex", 6 }, { "Hidden", false }, { "SortOrder", 0 }, { "BookmarkIndex", -1 }, { "JumpToBookmarkIndex", -1 }, { "ChangeIgnored", false } }.Values.Cast().ToArray()); // Outbound Arrow - printTable.Rows.Add(new OrderedDictionary { { "TableIndex", 0 }, { "ColumnIndex", 9 }, { "Hidden", false }, { "SortOrder", -1 }, { "BookmarkIndex", -1 }, { "JumpToBookmarkIndex", -1 }, { "ChangeIgnored", true } }.Values.Cast().ToArray()); - - // Outbound Precedence - printTable.Rows.Add(new OrderedDictionary { { "TableIndex", 0 }, { "ColumnIndex", 10 }, { "Hidden", false }, { "SortOrder", -1 }, { "BookmarkIndex", -1 }, { "JumpToBookmarkIndex", -1 }, { "ChangeIgnored", false } }.Values.Cast().ToArray()); + printTable.Rows.Add(new OrderedDictionary { { "TableIndex", 0 }, { "ColumnIndex", 7 }, { "Hidden", false }, { "SortOrder", -1 }, { "BookmarkIndex", -1 }, { "JumpToBookmarkIndex", -1 }, { "ChangeIgnored", true } }.Values.Cast().ToArray()); // Outbound Connector Name - printTable.Rows.Add(new OrderedDictionary { { "TableIndex", 0 }, { "ColumnIndex", 11 }, { "Hidden", false }, { "SortOrder", -1 }, { "BookmarkIndex", -1 }, { "JumpToBookmarkIndex", 12 }, { "ChangeIgnored", false } }.Values.Cast().ToArray()); - - // Outbound Connector Guid - required for bookmarks - printTable.Rows.Add(new OrderedDictionary { { "TableIndex", 0 }, { "ColumnIndex", 12 }, { "Hidden", true }, { "SortOrder", -1 }, { "BookmarkIndex", -1 }, { "JumpToBookmarkIndex", -1 }, { "ChangeIgnored", false } }.Values.Cast().ToArray()); + printTable.Rows.Add(new OrderedDictionary { { "TableIndex", 0 }, { "ColumnIndex", 8 }, { "Hidden", false }, { "SortOrder", -1 }, { "BookmarkIndex", -1 }, { "JumpToBookmarkIndex", 8 }, { "ChangeIgnored", false } }.Values.Cast().ToArray()); // Outbound Sync Rule Name - printTable.Rows.Add(new OrderedDictionary { { "TableIndex", 0 }, { "ColumnIndex", 13 }, { "Hidden", false }, { "SortOrder", -1 }, { "BookmarkIndex", -1 }, { "JumpToBookmarkIndex", 14 }, { "ChangeIgnored", false } }.Values.Cast().ToArray()); - - // Outbound Sync Rule Guid - required for bookmarks - printTable.Rows.Add(new OrderedDictionary { { "TableIndex", 0 }, { "ColumnIndex", 14 }, { "Hidden", true }, { "SortOrder", -1 }, { "BookmarkIndex", -1 }, { "JumpToBookmarkIndex", -1 }, { "ChangeIgnored", false } }.Values.Cast().ToArray()); + printTable.Rows.Add(new OrderedDictionary { { "TableIndex", 0 }, { "ColumnIndex", 9 }, { "Hidden", false }, { "SortOrder", -1 }, { "BookmarkIndex", -1 }, { "JumpToBookmarkIndex", 9 }, { "ChangeIgnored", false } }.Values.Cast().ToArray()); // Outbound Sync Rule Scoping Condition String - printTable.Rows.Add(new OrderedDictionary { { "TableIndex", 0 }, { "ColumnIndex", 15 }, { "Hidden", false }, { "SortOrder", -1 }, { "BookmarkIndex", -1 }, { "JumpToBookmarkIndex", -1 }, { "ChangeIgnored", false } }.Values.Cast().ToArray()); + printTable.Rows.Add(new OrderedDictionary { { "TableIndex", 0 }, { "ColumnIndex", 10 }, { "Hidden", false }, { "SortOrder", -1 }, { "BookmarkIndex", -1 }, { "JumpToBookmarkIndex", -1 }, { "ChangeIgnored", false } }.Values.Cast().ToArray()); // Outbound Object Type - printTable.Rows.Add(new OrderedDictionary { { "TableIndex", 0 }, { "ColumnIndex", 16 }, { "Hidden", false }, { "SortOrder", -1 }, { "BookmarkIndex", -1 }, { "JumpToBookmarkIndex", -1 }, { "ChangeIgnored", false } }.Values.Cast().ToArray()); - - // Outbound Flow Type - printTable.Rows.Add(new OrderedDictionary { { "TableIndex", 0 }, { "ColumnIndex", 17 }, { "Hidden", false }, { "SortOrder", -1 }, { "BookmarkIndex", -1 }, { "JumpToBookmarkIndex", -1 }, { "ChangeIgnored", true } }.Values.Cast().ToArray()); + printTable.Rows.Add(new OrderedDictionary { { "TableIndex", 0 }, { "ColumnIndex", 11 }, { "Hidden", false }, { "SortOrder", -1 }, { "BookmarkIndex", -1 }, { "JumpToBookmarkIndex", -1 }, { "ChangeIgnored", false } }.Values.Cast().ToArray()); // Outbound Expression - printTable.Rows.Add(new OrderedDictionary { { "TableIndex", 0 }, { "ColumnIndex", 18 }, { "Hidden", false }, { "SortOrder", -1 }, { "BookmarkIndex", -1 }, { "JumpToBookmarkIndex", -1 }, { "ChangeIgnored", false } }.Values.Cast().ToArray()); + printTable.Rows.Add(new OrderedDictionary { { "TableIndex", 0 }, { "ColumnIndex", 12 }, { "Hidden", false }, { "SortOrder", -1 }, { "BookmarkIndex", -1 }, { "JumpToBookmarkIndex", -1 }, { "ChangeIgnored", false } }.Values.Cast().ToArray()); + + // Outbound Flow Type + printTable.Rows.Add(new OrderedDictionary { { "TableIndex", 0 }, { "ColumnIndex", 13 }, { "Hidden", false }, { "SortOrder", -1 }, { "BookmarkIndex", -1 }, { "JumpToBookmarkIndex", -1 }, { "ChangeIgnored", true } }.Values.Cast().ToArray()); // Target Attribute - printTable.Rows.Add(new OrderedDictionary { { "TableIndex", 0 }, { "ColumnIndex", 19 }, { "Hidden", false }, { "SortOrder", -1 }, { "BookmarkIndex", -1 }, { "JumpToBookmarkIndex", -1 }, { "ChangeIgnored", false } }.Values.Cast().ToArray()); + printTable.Rows.Add(new OrderedDictionary { { "TableIndex", 0 }, { "ColumnIndex", 14 }, { "Hidden", false }, { "SortOrder", -1 }, { "BookmarkIndex", -1 }, { "JumpToBookmarkIndex", -1 }, { "ChangeIgnored", false } }.Values.Cast().ToArray()); printTable.AcceptChanges(); @@ -1407,7 +1379,7 @@ protected DataTable GetConnectorObjectImportAttributeFlowsSummaryPrintTable() protected void FillConnectorObjectImportAttributeFlowsSummary(bool pilotConfig) { //columns and order - //inboundSyncRuleName, inboundSyncRuleGuid inboundSyncRuleScopingConditionString, inboundExpression, inboundFlowType, inboundPrecedence, inboundArrow, metaverseAttribute, metaverseObjectType, outboundArrow, outboundPrecedence, outboundConnectorName, outboundConnectorGuid, outboundSyncRuleName, outboundSyncRuleGuid outboundSyncRuleScopingConditionString, outboundObjectType, outboundFlowType, outboundExpression, targetAttribute + //inboundSyncRuleName, inboundSyncRuleScopingConditionString, inboundExpression, inboundFlowType, inboundArrow, metaverseAttribute, metaverseObjectType, outboundArrow, outboundConnectorName, outboundSyncRuleName, outboundSyncRuleScopingConditionString, outboundObjectType, outboundExpression, outboundFlowType, targetAttribute Logger.Instance.WriteMethodEntry("Pilot Config: '{0}'.", pilotConfig); try @@ -1478,21 +1450,26 @@ orderby outboundSyncRulePrecedence string inboundExpression = ""; string inboundSyncRuleScopingConditionString = ""; string inboundFlowType = ""; - string inboundPrecedence = ""; if (inboundSyncRules.ElementAtOrDefault(i) != null) { inboundSyncRuleName = (string)inboundSyncRules.ElementAt(i).Element("name"); inboundSyncRuleGuid = (string)inboundSyncRules.ElementAt(i).Element("id"); metaverseObjectType = (string)inboundSyncRules.ElementAt(i).Element("targetObjectType"); - inboundPrecedence = (string)inboundSyncRules.ElementAt(i).Element("precedence"); ++inboundSyncRuleRank; + if (inboundSyncRules.ElementAt(i).XPathSelectElements("./attribute-mappings/mapping[dest = '" + metaverseAttribute + "']").Count() > 1) + { + string s = ""; + } var transformation = inboundSyncRules.ElementAt(i).XPathSelectElement("./attribute-mappings/mapping[dest = '" + metaverseAttribute + "']"); + //Expression expression = (string)transformation.Element("expression"); + //Direct srcAttribute = (string)transformation.XPathSelectElement("src/attr"); + //Constant var src = (string)transformation.XPathSelectElement("src"); inboundExpression = !string.IsNullOrEmpty(expression) ? expression : !string.IsNullOrEmpty(srcAttribute) ? srcAttribute : src; - inboundFlowType = !string.IsNullOrEmpty(expression) ? "Expression" : "Direct"; + inboundFlowType = !string.IsNullOrEmpty(expression) ? "Expression" : !string.IsNullOrEmpty(srcAttribute) ? "Direct" : "Constant"; var inboundSyncRuleScopingConditions = inboundSyncRules.ElementAt(i).XPathSelectElements("./synchronizationCriteria/conditions"); var inboundSyncRuleScopingConditionsCount = inboundSyncRuleScopingConditions.Count(); @@ -1523,7 +1500,6 @@ orderby outboundSyncRulePrecedence string outboundSyncRuleScopingCondition = ""; string outboundObjectType = ""; string outboundFlowType = ""; - string outboundPrecedence = ""; if (outboundSyncRules.ElementAtOrDefault(i) != null) { outboundSyncRuleName = (string)outboundSyncRules.ElementAt(i).Element("name"); @@ -1531,7 +1507,6 @@ orderby outboundSyncRulePrecedence metaverseObjectType = (string)outboundSyncRules.ElementAt(i).Element("sourceObjectType"); outboundConnectorGuid = ((string)outboundSyncRules.ElementAt(i).Element("connector") ?? string.Empty).ToUpperInvariant(); outboundObjectType = (string)outboundSyncRules.ElementAt(i).Element("targetObjectType"); - outboundPrecedence = (string)outboundSyncRules.ElementAt(i).Element("precedence"); outboundConnectorName = (string)config.XPathSelectElement(Documenter.GetConnectorXmlRootXPath(pilotConfig) + "/ma-data[translate(id, '" + Documenter.LowercaseLetters + "', '" + Documenter.UppercaseLetters + "') = '" + outboundConnectorGuid + "']/name"); if (string.IsNullOrEmpty(outboundConnectorName)) { @@ -1572,8 +1547,8 @@ orderby outboundSyncRulePrecedence } } //columns and order - //inboundSyncRuleName, inboundSyncRuleGuid inboundSyncRuleScopingConditionString, inboundExpression, inboundFlowType, inboundPrecedence, inboundArrow, metaverseAttribute, metaverseObjectType, outboundArrow, outboundPrecedence, outboundConnectorName, outboundConnectorGuid, outboundSyncRuleName, outboundSyncRuleGuid outboundSyncRuleScopingConditionString, outboundObjectType, outboundFlowType, outboundExpression, targetAttribute - Documenter.AddRow(table, new object[] { inboundSyncRuleName, inboundSyncRuleGuid, inboundSyncRuleScopingConditionString, inboundExpression, inboundFlowType, inboundPrecedence, "→", metaverseAttribute, metaverseObjectType, "→", outboundPrecedence, outboundConnectorName, outboundConnectorGuid, outboundSyncRuleName, outboundSyncRuleGuid, outboundSyncRuleScopingCondition, outboundObjectType, outboundFlowType, outboundExpression, targetAttribute }); + //inboundSyncRuleName, inboundSyncRuleScopingConditionString, inboundExpression, inboundFlowType, inboundArrow, metaverseAttribute, metaverseObjectType, outboundArrow, outboundConnectorName, outboundSyncRuleName, outboundSyncRuleScopingConditionString, outboundObjectType, outboundExpression, outboundFlowType, targetAttribute + Documenter.AddRow(table, new object[] { inboundSyncRuleName, inboundSyncRuleScopingConditionString, inboundExpression, inboundFlowType, "→", metaverseAttribute, metaverseObjectType, "→", outboundConnectorName, outboundSyncRuleName, outboundSyncRuleScopingCondition, outboundObjectType, outboundExpression, outboundFlowType, targetAttribute }); } } } @@ -1618,71 +1593,64 @@ protected DataTable GetConnectorObjectImportAttributeFlowsSummaryHeaderTable() { var headerTable = Documenter.GetHeaderTable(); - //columns and order - doesn't include hidden GUID columns - //inboundSyncRuleName, inboundSyncRuleScopingConditionString, inboundExpression, inboundFlowType, inboundPrecedence, inboundArrow, metaverseAttribute, metaverseObjectType, outboundArrow, outboundPrecedence, outboundConnectorName, outboundSyncRuleName, outboundSyncRuleScopingConditionString, outboundObjectType, outboundFlowType, outboundExpression, targetAttribute - //colWidths - //10 + 1 + 10 + 6 + 5 + 2 + 8 + 5 + 2 + 5 + 10 + 10 + 1 + 5 + 6 + 10 + 7 + //columns and order + //inboundSyncRuleName, inboundSyncRuleScopingConditionString, inboundExpression, inboundFlowType, inboundArrow, metaverseAttribute, metaverseObjectType, outboundArrow, outboundConnectorName, outboundSyncRuleName, outboundSyncRuleScopingConditionString, outboundObjectType, outboundFlowType, outboundExpression, targetAttribute + // Header Row 1 // Import Flows - headerTable.Rows.Add(new OrderedDictionary { { "RowIndex", 0 }, { "ColumnIndex", 0 }, { "ColumnName", "Import Flows" }, { "RowSpan", 1 }, { "ColSpan", 6 }, { "ColWidth", 0 } }.Values.Cast().ToArray()); + headerTable.Rows.Add(new OrderedDictionary { { "RowIndex", 0 }, { "ColumnIndex", 0 }, { "ColumnName", "Import Flows" }, { "RowSpan", 1 }, { "ColSpan", 5 }, { "ColWidth", 0 } }.Values.Cast().ToArray()); // MV Attribute headerTable.Rows.Add(new OrderedDictionary { { "RowIndex", 0 }, { "ColumnIndex", 1 }, { "ColumnName", "Metaverse" }, { "RowSpan", 1 }, { "ColSpan", 3 }, { "ColWidth", 0 } }.Values.Cast().ToArray()); // Export Flows - headerTable.Rows.Add(new OrderedDictionary { { "RowIndex", 0 }, { "ColumnIndex", 2 }, { "ColumnName", "Export Flows" }, { "RowSpan", 1 }, { "ColSpan", 9 }, { "ColWidth", 0 } }.Values.Cast().ToArray()); + headerTable.Rows.Add(new OrderedDictionary { { "RowIndex", 0 }, { "ColumnIndex", 2 }, { "ColumnName", "Export Flows" }, { "RowSpan", 1 }, { "ColSpan", 7 }, { "ColWidth", 0 } }.Values.Cast().ToArray()); // Header Row 2 // Inbound Sync Rule Name - headerTable.Rows.Add(new OrderedDictionary { { "RowIndex", 1 }, { "ColumnIndex", 0 }, { "ColumnName", "Sync Rule" }, { "RowSpan", 1 }, { "ColSpan", 1 }, { "ColWidth", 10 } }.Values.Cast().ToArray()); + headerTable.Rows.Add(new OrderedDictionary { { "RowIndex", 1 }, { "ColumnIndex", 0 }, { "ColumnName", "Inbound Sync Rule" }, { "RowSpan", 1 }, { "ColSpan", 1 }, { "ColWidth", 10 } }.Values.Cast().ToArray()); // Inbound Sync Rule Scoping Condition String - headerTable.Rows.Add(new OrderedDictionary { { "RowIndex", 1 }, { "ColumnIndex", 1 }, { "ColumnName", "Sync Rule Scoping Condition" }, { "RowSpan", 1 }, { "ColSpan", 1 }, { "ColWidth", 10 } }.Values.Cast().ToArray()); + headerTable.Rows.Add(new OrderedDictionary { { "RowIndex", 1 }, { "ColumnIndex", 1 }, { "ColumnName", "Inbound Sync Rule Scoping Condition" }, { "RowSpan", 1 }, { "ColSpan", 1 }, { "ColWidth", 10 } }.Values.Cast().ToArray()); // Inbound Expression - headerTable.Rows.Add(new OrderedDictionary { { "RowIndex", 1 }, { "ColumnIndex", 2 }, { "ColumnName", "Expression" }, { "RowSpan", 1 }, { "ColSpan", 1 }, { "ColWidth", 10 } }.Values.Cast().ToArray()); + headerTable.Rows.Add(new OrderedDictionary { { "RowIndex", 1 }, { "ColumnIndex", 2 }, { "ColumnName", "Inbound Expression" }, { "RowSpan", 1 }, { "ColSpan", 1 }, { "ColWidth", 10 } }.Values.Cast().ToArray()); // Inbound Flow Type - headerTable.Rows.Add(new OrderedDictionary { { "RowIndex", 1 }, { "ColumnIndex", 3 }, { "ColumnName", "Flow Type" }, { "RowSpan", 1 }, { "ColSpan", 1 }, { "ColWidth", 6 } }.Values.Cast().ToArray()); - - // Inbound Precedence - headerTable.Rows.Add(new OrderedDictionary { { "RowIndex", 1 }, { "ColumnIndex", 4 }, { "ColumnName", "Rank" }, { "RowSpan", 1 }, { "ColSpan", 1 }, { "ColWidth", 5 } }.Values.Cast().ToArray()); + headerTable.Rows.Add(new OrderedDictionary { { "RowIndex", 1 }, { "ColumnIndex", 3 }, { "ColumnName", "Inbound Flow Type" }, { "RowSpan", 1 }, { "ColSpan", 1 }, { "ColWidth", 10 } }.Values.Cast().ToArray()); // Inbound Arrow - headerTable.Rows.Add(new OrderedDictionary { { "RowIndex", 1 }, { "ColumnIndex", 5 }, { "ColumnName", "→" }, { "RowSpan", 1 }, { "ColSpan", 1 }, { "ColWidth", 2 } }.Values.Cast().ToArray()); + headerTable.Rows.Add(new OrderedDictionary { { "RowIndex", 1 }, { "ColumnIndex", 4 }, { "ColumnName", "→" }, { "RowSpan", 1 }, { "ColSpan", 1 }, { "ColWidth", 2 } }.Values.Cast().ToArray()); // Metaverse attribute - headerTable.Rows.Add(new OrderedDictionary { { "RowIndex", 1 }, { "ColumnIndex", 6 }, { "ColumnName", "MV Attribute" }, { "RowSpan", 1 }, { "ColSpan", 1 }, { "ColWidth", 8 } }.Values.Cast().ToArray()); + headerTable.Rows.Add(new OrderedDictionary { { "RowIndex", 1 }, { "ColumnIndex", 5 }, { "ColumnName", "Metaverse Attribute" }, { "RowSpan", 1 }, { "ColSpan", 1 }, { "ColWidth", 8 } }.Values.Cast().ToArray()); // Metaverse Object Type - headerTable.Rows.Add(new OrderedDictionary { { "RowIndex", 1 }, { "ColumnIndex", 7 }, { "ColumnName", "MV Object Type" }, { "RowSpan", 1 }, { "ColSpan", 1 }, { "ColWidth", 5 } }.Values.Cast().ToArray()); + headerTable.Rows.Add(new OrderedDictionary { { "RowIndex", 1 }, { "ColumnIndex", 6 }, { "ColumnName", "Metaverse Object Type" }, { "RowSpan", 1 }, { "ColSpan", 1 }, { "ColWidth", 8 } }.Values.Cast().ToArray()); // Outbound Arrow - headerTable.Rows.Add(new OrderedDictionary { { "RowIndex", 1 }, { "ColumnIndex", 8 }, { "ColumnName", "→" }, { "RowSpan", 1 }, { "ColSpan", 1 }, { "ColWidth", 2 } }.Values.Cast().ToArray()); - - // Outbound Precedence - headerTable.Rows.Add(new OrderedDictionary { { "RowIndex", 1 }, { "ColumnIndex", 9 }, { "ColumnName", "Rank" }, { "RowSpan", 1 }, { "ColSpan", 1 }, { "ColWidth", 5 } }.Values.Cast().ToArray()); + headerTable.Rows.Add(new OrderedDictionary { { "RowIndex", 1 }, { "ColumnIndex", 7 }, { "ColumnName", "→" }, { "RowSpan", 1 }, { "ColSpan", 1 }, { "ColWidth", 2 } }.Values.Cast().ToArray()); // Outbound Connector Name - headerTable.Rows.Add(new OrderedDictionary { { "RowIndex", 1 }, { "ColumnIndex", 10 }, { "ColumnName", "Connector" }, { "RowSpan", 1 }, { "ColSpan", 1 }, { "ColWidth", 10 } }.Values.Cast().ToArray()); + headerTable.Rows.Add(new OrderedDictionary { { "RowIndex", 1 }, { "ColumnIndex", 8 }, { "ColumnName", "Outbound Connector" }, { "RowSpan", 1 }, { "ColSpan", 1 }, { "ColWidth", 10 } }.Values.Cast().ToArray()); // Outbound Sync Rule Name - headerTable.Rows.Add(new OrderedDictionary { { "RowIndex", 1 }, { "ColumnIndex", 11 }, { "ColumnName", "Sync Rule" }, { "RowSpan", 1 }, { "ColSpan", 1 }, { "ColWidth", 10 } }.Values.Cast().ToArray()); + headerTable.Rows.Add(new OrderedDictionary { { "RowIndex", 1 }, { "ColumnIndex", 9 }, { "ColumnName", "Outbound Sync Rule" }, { "RowSpan", 1 }, { "ColSpan", 1 }, { "ColWidth", 10 } }.Values.Cast().ToArray()); // Outbound Sync Rule Scoping Condition String - headerTable.Rows.Add(new OrderedDictionary { { "RowIndex", 1 }, { "ColumnIndex", 12 }, { "ColumnName", "Sync Rule Scoping Condition" }, { "RowSpan", 1 }, { "ColSpan", 1 }, { "ColWidth", 10 } }.Values.Cast().ToArray()); + headerTable.Rows.Add(new OrderedDictionary { { "RowIndex", 1 }, { "ColumnIndex", 10 }, { "ColumnName", "Outbound Sync Rule Scoping Condition" }, { "RowSpan", 1 }, { "ColSpan", 1 }, { "ColWidth", 10 } }.Values.Cast().ToArray()); // Outbound Object Type - headerTable.Rows.Add(new OrderedDictionary { { "RowIndex", 1 }, { "ColumnIndex", 13 }, { "ColumnName", "Object Type" }, { "RowSpan", 1 }, { "ColSpan", 1 }, { "ColWidth", 5 } }.Values.Cast().ToArray()); + headerTable.Rows.Add(new OrderedDictionary { { "RowIndex", 1 }, { "ColumnIndex", 11 }, { "ColumnName", "Outbound Object Type" }, { "RowSpan", 1 }, { "ColSpan", 1 }, { "ColWidth", 10 } }.Values.Cast().ToArray()); // Outbound Flow Type - headerTable.Rows.Add(new OrderedDictionary { { "RowIndex", 1 }, { "ColumnIndex", 14 }, { "ColumnName", "Flow Type" }, { "RowSpan", 1 }, { "ColSpan", 1 }, { "ColWidth", 6 } }.Values.Cast().ToArray()); + headerTable.Rows.Add(new OrderedDictionary { { "RowIndex", 1 }, { "ColumnIndex", 12 }, { "ColumnName", "Outbound Flow Type" }, { "RowSpan", 1 }, { "ColSpan", 1 }, { "ColWidth", 10 } }.Values.Cast().ToArray()); // Outbound Expression - headerTable.Rows.Add(new OrderedDictionary { { "RowIndex", 1 }, { "ColumnIndex", 15 }, { "ColumnName", "Expression" }, { "RowSpan", 1 }, { "ColSpan", 1 }, { "ColWidth", 10 } }.Values.Cast().ToArray()); + headerTable.Rows.Add(new OrderedDictionary { { "RowIndex", 1 }, { "ColumnIndex", 13 }, { "ColumnName", "Outbound Expression" }, { "RowSpan", 1 }, { "ColSpan", 1 }, { "ColWidth", 10 } }.Values.Cast().ToArray()); // Target Attribute - headerTable.Rows.Add(new OrderedDictionary { { "RowIndex", 1 }, { "ColumnIndex", 16 }, { "ColumnName", "Target Attribute" }, { "RowSpan", 1 }, { "ColSpan", 1 }, { "ColWidth", 7 } }.Values.Cast().ToArray()); + headerTable.Rows.Add(new OrderedDictionary { { "RowIndex", 1 }, { "ColumnIndex", 14 }, { "ColumnName", "Target Attribute" }, { "RowSpan", 1 }, { "ColSpan", 1 }, { "ColWidth", 10 } }.Values.Cast().ToArray()); headerTable.AcceptChanges(); @@ -1754,33 +1722,25 @@ protected void CreateConnectorObjectExportAttributeFlowsSummaryDataSets() { Logger.Instance.WriteMethodEntry(); //columns and order - //inboundSyncRuleName, inboundSyncRuleGuid inboundSyncRuleScopingConditionString, inboundExpression, inboundFlowType, inboundPrecedence, inboundArrow, metaverseAttribute, metaverseObjectType, outboundArrow, outboundPrecedence, outboundConnectorName, outboundConnectorGuid, outboundSyncRuleName, outboundSyncRuleGuid outboundSyncRuleScopingConditionString, outboundObjectType, outboundFlowType, outboundExpression, targetAttribute + //inboundSyncRuleName, inboundSyncRuleScopingConditionString, inboundExpression, inboundFlowType, inboundArrow, metaverseAttribute, metaverseObjectType, outboundArrow, outboundConnectorName, outboundSyncRuleName, outboundSyncRuleScopingConditionString, outboundObjectType, outboundExpression, outboundFlowType, targetAttribute try { var table = new DataTable("ExportSummary") { Locale = CultureInfo.InvariantCulture }; var column1 = new DataColumn("inboundSyncRuleName"); - //required for bookmarks - var column2 = new DataColumn("inboundSyncRuleGuid"); - var column3 = new DataColumn("inboundSyncRuleScopingConditionString"); - var column4 = new DataColumn("inboundExpression"); - var column5 = new DataColumn("inboundFlowType"); - var column6 = new DataColumn("inboundPrecedence"); - var column7 = new DataColumn("inboundArrow"); - var column8 = new DataColumn("metaverseAttribute"); - var column9 = new DataColumn("metaverseObjectType"); - var column10 = new DataColumn("outboundArrow"); - var column11 = new DataColumn("outboundPrecedence"); - var column12 = new DataColumn("outboundConnectorName"); - //required for bookmarks - var column13 = new DataColumn("outboundConnectorGuid"); - var column14 = new DataColumn("outboundSyncRuleName"); - //required for bookmarks - var column15 = new DataColumn("outboundSyncRuleGuid"); - var column16 = new DataColumn("outboundSyncRuleScopingConditionString"); - var column17 = new DataColumn("outboundObjectType"); - var column18 = new DataColumn("outboundExpression"); - var column19 = new DataColumn("outboundFlowType"); - var column20 = new DataColumn("targetAttribute"); + var column2 = new DataColumn("inboundSyncRuleScopingConditionString"); + var column3 = new DataColumn("inboundExpression"); + var column4 = new DataColumn("inboundFlowType"); + var column5 = new DataColumn("inboundArrow"); + var column6 = new DataColumn("metaverseAttribute"); + var column7 = new DataColumn("metaverseObjectType"); + var column8 = new DataColumn("outboundArrow"); + var column9 = new DataColumn("outboundConnectorName"); + var column10 = new DataColumn("outboundSyncRuleName"); + var column11 = new DataColumn("outboundSyncRuleScopingConditionString"); + var column12 = new DataColumn("outboundObjectType"); + var column13 = new DataColumn("outboundExpression"); + var column14 = new DataColumn("outboundFlowType"); + var column15 = new DataColumn("targetAttribute"); table.Columns.Add(column1); table.Columns.Add(column2); @@ -1797,12 +1757,7 @@ protected void CreateConnectorObjectExportAttributeFlowsSummaryDataSets() table.Columns.Add(column13); table.Columns.Add(column14); table.Columns.Add(column15); - table.Columns.Add(column16); - table.Columns.Add(column17); - table.Columns.Add(column18); - table.Columns.Add(column19); - table.Columns.Add(column20); - table.PrimaryKey = new[] { column1, column2, column3, column4, column5, column6, column7, column8, column9, column10, column11, column12, column13, column14, column15, column16, column17, column18, column19, column20 }; + table.PrimaryKey = new[] { column1, column2, column3, column4, column5, column6, column7, column8, column9, column10, column11, column12, column13, column14, column15 }; this.PilotDataSet = new DataSet("ExportAttributeFlowsSummary") { Locale = CultureInfo.InvariantCulture }; this.PilotDataSet.Tables.Add(table); @@ -1830,67 +1785,52 @@ protected DataTable GetConnectorObjectExportAttributeFlowsSummaryPrintTable() { var printTable = Documenter.GetPrintTable(); //columns and order - //inboundSyncRuleName, inboundSyncRuleGuid, inboundSyncRuleScopingConditionString, inboundExpression, inboundFlowType, inboundPrecedence, inboundArrow, metaverseAttribute, metaverseObjectType, outboundArrow, outboundPrecedence, outboundConnectorName, outboundConnectorGuid, outboundSyncRuleName, outboundSyncRuleGuid, outboundSyncRuleScopingConditionString, outboundObjectType, outboundFlowType, outboundExpression, targetAttribute + //inboundSyncRuleName, inboundSyncRuleScopingConditionString, inboundExpression, inboundFlowType, inboundArrow, metaverseAttribute, metaverseObjectType, outboundArrow, outboundConnectorName, outboundSyncRuleName, outboundSyncRuleScopingConditionString, outboundObjectType, outboundExpression, outboundFlowType,targetAttribute // Inbound Sync Rule Name - printTable.Rows.Add(new OrderedDictionary { { "TableIndex", 0 }, { "ColumnIndex", 0 }, { "Hidden", false }, { "SortOrder", -1 }, { "BookmarkIndex", -1 }, { "JumpToBookmarkIndex", 1 }, { "ChangeIgnored", false } }.Values.Cast().ToArray()); - - // Inbound Sync Rule Guid - required for bookmarks - printTable.Rows.Add(new OrderedDictionary { { "TableIndex", 0 }, { "ColumnIndex", 1 }, { "Hidden", true }, { "SortOrder", -1 }, { "BookmarkIndex", -1 }, { "JumpToBookmarkIndex", -1 }, { "ChangeIgnored", false } }.Values.Cast().ToArray()); + printTable.Rows.Add(new OrderedDictionary { { "TableIndex", 0 }, { "ColumnIndex", 0 }, { "Hidden", false }, { "SortOrder", -1 }, { "BookmarkIndex", -1 }, { "JumpToBookmarkIndex", 5 }, { "ChangeIgnored", false } }.Values.Cast().ToArray()); // Inbound Sync Rule Scoping Condition String - printTable.Rows.Add(new OrderedDictionary { { "TableIndex", 0 }, { "ColumnIndex", 2 }, { "Hidden", false }, { "SortOrder", -1 }, { "BookmarkIndex", -1 }, { "JumpToBookmarkIndex", -1 }, { "ChangeIgnored", false } }.Values.Cast().ToArray()); + printTable.Rows.Add(new OrderedDictionary { { "TableIndex", 0 }, { "ColumnIndex", 1 }, { "Hidden", false }, { "SortOrder", -1 }, { "BookmarkIndex", -1 }, { "JumpToBookmarkIndex", -1 }, { "ChangeIgnored", false } }.Values.Cast().ToArray()); // Inbound Expression - printTable.Rows.Add(new OrderedDictionary { { "TableIndex", 0 }, { "ColumnIndex", 3 }, { "Hidden", false }, { "SortOrder", -1 }, { "BookmarkIndex", -1 }, { "JumpToBookmarkIndex", -1 }, { "ChangeIgnored", false } }.Values.Cast().ToArray()); + printTable.Rows.Add(new OrderedDictionary { { "TableIndex", 0 }, { "ColumnIndex", 2 }, { "Hidden", false }, { "SortOrder", -1 }, { "BookmarkIndex", -1 }, { "JumpToBookmarkIndex", -1 }, { "ChangeIgnored", false } }.Values.Cast().ToArray()); // Inbound Flow Type - printTable.Rows.Add(new OrderedDictionary { { "TableIndex", 0 }, { "ColumnIndex", 4 }, { "Hidden", false }, { "SortOrder", -1 }, { "BookmarkIndex", -1 }, { "JumpToBookmarkIndex", -1 }, { "ChangeIgnored", true } }.Values.Cast().ToArray()); - - // Inbound Precedence - printTable.Rows.Add(new OrderedDictionary { { "TableIndex", 0 }, { "ColumnIndex", 5 }, { "Hidden", false }, { "SortOrder", -1 }, { "BookmarkIndex", -1 }, { "JumpToBookmarkIndex", -1 }, { "ChangeIgnored", true } }.Values.Cast().ToArray()); + printTable.Rows.Add(new OrderedDictionary { { "TableIndex", 0 }, { "ColumnIndex", 3 }, { "Hidden", false }, { "SortOrder", -1 }, { "BookmarkIndex", -1 }, { "JumpToBookmarkIndex", -1 }, { "ChangeIgnored", true } }.Values.Cast().ToArray()); // Inbound Arrow - printTable.Rows.Add(new OrderedDictionary { { "TableIndex", 0 }, { "ColumnIndex", 6 }, { "Hidden", false }, { "SortOrder", -1 }, { "BookmarkIndex", -1 }, { "JumpToBookmarkIndex", -1 }, { "ChangeIgnored", true } }.Values.Cast().ToArray()); + printTable.Rows.Add(new OrderedDictionary { { "TableIndex", 0 }, { "ColumnIndex", 4 }, { "Hidden", false }, { "SortOrder", -1 }, { "BookmarkIndex", -1 }, { "JumpToBookmarkIndex", -1 }, { "ChangeIgnored", true } }.Values.Cast().ToArray()); // Metaverse Attribute - printTable.Rows.Add(new OrderedDictionary { { "TableIndex", 0 }, { "ColumnIndex", 7 }, { "Hidden", false }, { "SortOrder", 0 }, { "BookmarkIndex", -1 }, { "JumpToBookmarkIndex", -1 }, { "ChangeIgnored", false } }.Values.Cast().ToArray()); + printTable.Rows.Add(new OrderedDictionary { { "TableIndex", 0 }, { "ColumnIndex", 5 }, { "Hidden", false }, { "SortOrder", 0 }, { "BookmarkIndex", -1 }, { "JumpToBookmarkIndex", -1 }, { "ChangeIgnored", false } }.Values.Cast().ToArray()); // Metaverse Object Type - printTable.Rows.Add(new OrderedDictionary { { "TableIndex", 0 }, { "ColumnIndex", 8 }, { "Hidden", false }, { "SortOrder", 0 }, { "BookmarkIndex", -1 }, { "JumpToBookmarkIndex", -1 }, { "ChangeIgnored", false } }.Values.Cast().ToArray()); + printTable.Rows.Add(new OrderedDictionary { { "TableIndex", 0 }, { "ColumnIndex", 6 }, { "Hidden", false }, { "SortOrder", 0 }, { "BookmarkIndex", -1 }, { "JumpToBookmarkIndex", -1 }, { "ChangeIgnored", false } }.Values.Cast().ToArray()); // Outbound Arrow - printTable.Rows.Add(new OrderedDictionary { { "TableIndex", 0 }, { "ColumnIndex", 9 }, { "Hidden", false }, { "SortOrder", -1 }, { "BookmarkIndex", -1 }, { "JumpToBookmarkIndex", -1 }, { "ChangeIgnored", true } }.Values.Cast().ToArray()); - - // Outbound Precedence - printTable.Rows.Add(new OrderedDictionary { { "TableIndex", 0 }, { "ColumnIndex", 10 }, { "Hidden", false }, { "SortOrder", -1 }, { "BookmarkIndex", -1 }, { "JumpToBookmarkIndex", -1 }, { "ChangeIgnored", false } }.Values.Cast().ToArray()); + printTable.Rows.Add(new OrderedDictionary { { "TableIndex", 0 }, { "ColumnIndex", 7 }, { "Hidden", false }, { "SortOrder", -1 }, { "BookmarkIndex", -1 }, { "JumpToBookmarkIndex", -1 }, { "ChangeIgnored", true } }.Values.Cast().ToArray()); // Outbound Connector Name - printTable.Rows.Add(new OrderedDictionary { { "TableIndex", 0 }, { "ColumnIndex", 11 }, { "Hidden", false }, { "SortOrder", -1 }, { "BookmarkIndex", -1 }, { "JumpToBookmarkIndex", 12 }, { "ChangeIgnored", false } }.Values.Cast().ToArray()); - - // Outbound Connector Guid - required for bookmarks - printTable.Rows.Add(new OrderedDictionary { { "TableIndex", 0 }, { "ColumnIndex", 12 }, { "Hidden", true }, { "SortOrder", -1 }, { "BookmarkIndex", -1 }, { "JumpToBookmarkIndex", -1 }, { "ChangeIgnored", false } }.Values.Cast().ToArray()); + printTable.Rows.Add(new OrderedDictionary { { "TableIndex", 0 }, { "ColumnIndex", 8 }, { "Hidden", false }, { "SortOrder", -1 }, { "BookmarkIndex", -1 }, { "JumpToBookmarkIndex", 8 }, { "ChangeIgnored", false } }.Values.Cast().ToArray()); // Outbound Sync Rule Name - printTable.Rows.Add(new OrderedDictionary { { "TableIndex", 0 }, { "ColumnIndex", 13 }, { "Hidden", false }, { "SortOrder", -1 }, { "BookmarkIndex", -1 }, { "JumpToBookmarkIndex", 14 }, { "ChangeIgnored", false } }.Values.Cast().ToArray()); - - // Outbound Sync Rule Guid - required for bookmarks - printTable.Rows.Add(new OrderedDictionary { { "TableIndex", 0 }, { "ColumnIndex", 14 }, { "Hidden", true }, { "SortOrder", -1 }, { "BookmarkIndex", -1 }, { "JumpToBookmarkIndex", -1 }, { "ChangeIgnored", false } }.Values.Cast().ToArray()); + printTable.Rows.Add(new OrderedDictionary { { "TableIndex", 0 }, { "ColumnIndex", 9 }, { "Hidden", false }, { "SortOrder", -1 }, { "BookmarkIndex", -1 }, { "JumpToBookmarkIndex", 9 }, { "ChangeIgnored", false } }.Values.Cast().ToArray()); // Outbound Sync Rule Scoping Condition String - printTable.Rows.Add(new OrderedDictionary { { "TableIndex", 0 }, { "ColumnIndex", 15 }, { "Hidden", false }, { "SortOrder", -1 }, { "BookmarkIndex", -1 }, { "JumpToBookmarkIndex", -1 }, { "ChangeIgnored", false } }.Values.Cast().ToArray()); + printTable.Rows.Add(new OrderedDictionary { { "TableIndex", 0 }, { "ColumnIndex", 10 }, { "Hidden", false }, { "SortOrder", -1 }, { "BookmarkIndex", -1 }, { "JumpToBookmarkIndex", -1 }, { "ChangeIgnored", false } }.Values.Cast().ToArray()); // Outbound Object Type - printTable.Rows.Add(new OrderedDictionary { { "TableIndex", 0 }, { "ColumnIndex", 16 }, { "Hidden", false }, { "SortOrder", -1 }, { "BookmarkIndex", -1 }, { "JumpToBookmarkIndex", -1 }, { "ChangeIgnored", false } }.Values.Cast().ToArray()); + printTable.Rows.Add(new OrderedDictionary { { "TableIndex", 0 }, { "ColumnIndex", 11 }, { "Hidden", false }, { "SortOrder", -1 }, { "BookmarkIndex", -1 }, { "JumpToBookmarkIndex", -1 }, { "ChangeIgnored", false } }.Values.Cast().ToArray()); // Outbound Expression - printTable.Rows.Add(new OrderedDictionary { { "TableIndex", 0 }, { "ColumnIndex", 17 }, { "Hidden", false }, { "SortOrder", -1 }, { "BookmarkIndex", -1 }, { "JumpToBookmarkIndex", -1 }, { "ChangeIgnored", false } }.Values.Cast().ToArray()); + printTable.Rows.Add(new OrderedDictionary { { "TableIndex", 0 }, { "ColumnIndex", 12 }, { "Hidden", false }, { "SortOrder", -1 }, { "BookmarkIndex", -1 }, { "JumpToBookmarkIndex", -1 }, { "ChangeIgnored", false } }.Values.Cast().ToArray()); // Outbound Flow Type - printTable.Rows.Add(new OrderedDictionary { { "TableIndex", 0 }, { "ColumnIndex", 18 }, { "Hidden", false }, { "SortOrder", -1 }, { "BookmarkIndex", -1 }, { "JumpToBookmarkIndex", -1 }, { "ChangeIgnored", true } }.Values.Cast().ToArray()); + printTable.Rows.Add(new OrderedDictionary { { "TableIndex", 0 }, { "ColumnIndex", 13 }, { "Hidden", false }, { "SortOrder", -1 }, { "BookmarkIndex", -1 }, { "JumpToBookmarkIndex", -1 }, { "ChangeIgnored", true } }.Values.Cast().ToArray()); // Target Attribute - printTable.Rows.Add(new OrderedDictionary { { "TableIndex", 0 }, { "ColumnIndex", 19 }, { "Hidden", false }, { "SortOrder", -1 }, { "BookmarkIndex", -1 }, { "JumpToBookmarkIndex", -1 }, { "ChangeIgnored", false } }.Values.Cast().ToArray()); + printTable.Rows.Add(new OrderedDictionary { { "TableIndex", 0 }, { "ColumnIndex", 14 }, { "Hidden", false }, { "SortOrder", -1 }, { "BookmarkIndex", -1 }, { "JumpToBookmarkIndex", -1 }, { "ChangeIgnored", false } }.Values.Cast().ToArray()); printTable.AcceptChanges(); @@ -1910,7 +1850,7 @@ protected void FillConnectorObjectExportAttributeFlowsSummary(bool pilotConfig) { Logger.Instance.WriteMethodEntry("Pilot Config: '{0}'.", pilotConfig); //columns and order - //inboundSyncRuleName, inboundSyncRuleGuid, inboundSyncRuleScopingConditionString, inboundExpression, inboundFlowType, inboundPrecedence, inboundArrow, metaverseAttribute, metaverseObjectType, outboundArrow, outboundPrecedence, outboundConnectorName, outboundConnectorGuid, outboundSyncRuleName, outboundSyncRuleGuid, outboundSyncRuleScopingConditionString, outboundObjectType, outboundFlowType, outboundExpression, targetAttribute + //inboundSyncRuleName, inboundSyncRuleScopingConditionString, inboundExpression, inboundFlowType, inboundArrow, metaverseAttribute, metaverseObjectType, outboundArrow, outboundConnectorName, outboundSyncRuleName, outboundSyncRuleScopingConditionString, outboundObjectType, outboundExpression, outboundFlowType, targetAttribute try { @@ -1929,8 +1869,11 @@ protected void FillConnectorObjectExportAttributeFlowsSummary(bool pilotConfig) let dest = (string)outboundSyncRuleDestination orderby dest select dest; + //foreach (var metaverseAttribute in metaverseAttributes.Distinct()) foreach (var metaverseAttribute in metaverseAttributes.Distinct()) { + //Documenter.AddRow(table, new object[] { metaverseAttribute, "←" }); + // Outbound metaverse flows var outboundSyncRules = config.XPathSelectElements(Documenter.GetSynchronizationRuleXmlRootXPath(pilotConfig) + "/synchronizationRule[direction = 'Outbound' " + Documenter.SyncRuleDisabledCondition + " and targetObjectType = '" + this.currentDataSourceObjectType + "' and (attribute-mappings/mapping/src/attr = '" + metaverseAttribute + "' or contains(attribute-mappings/mapping/expression, '[" + metaverseAttribute + "]'))]"); outboundSyncRules = from syncRule in outboundSyncRules @@ -1989,25 +1932,26 @@ orderby inboundSyncRulePrecedence string inboundExpression = ""; string inboundSyncRuleScopingConditionString = ""; string inboundFlowType = ""; - string inboundPrecedence = ""; if (inboundSyncRules.ElementAtOrDefault(i) != null) { inboundSyncRuleName = (string)inboundSyncRules.ElementAt(i).Element("name"); inboundSyncRuleGuid = (string)inboundSyncRules.ElementAt(i).Element("id"); metaverseObjectType = (string)inboundSyncRules.ElementAt(i).Element("targetObjectType"); - inboundPrecedence = (string)inboundSyncRules.ElementAt(i).Element("precedence"); ++inboundSyncRuleRank; if (inboundSyncRules.ElementAt(i).XPathSelectElements("./attribute-mappings/mapping[dest = '" + metaverseAttribute + "']").Count() > 1) { string s = ""; } var transformation = inboundSyncRules.ElementAt(i).XPathSelectElement("./attribute-mappings/mapping[dest = '" + metaverseAttribute + "']"); + //Expression expression = (string)transformation.Element("expression"); + //Direct srcAttribute = (string)transformation.XPathSelectElement("src/attr"); + //Constant var src = (string)transformation.XPathSelectElement("src"); inboundExpression = !string.IsNullOrEmpty(expression) ? expression : !string.IsNullOrEmpty(srcAttribute) ? srcAttribute : src; - inboundFlowType = !string.IsNullOrEmpty(expression) ? "Expression" : "Direct"; + inboundFlowType = !string.IsNullOrEmpty(expression) ? "Expression" : !string.IsNullOrEmpty(srcAttribute) ? "Direct" : "Constant"; var inboundSyncRuleScopingConditions = inboundSyncRules.ElementAt(i).XPathSelectElements("./synchronizationCriteria/conditions"); var inboundSyncRuleScopingConditionsCount = inboundSyncRuleScopingConditions.Count(); @@ -2038,7 +1982,6 @@ orderby inboundSyncRulePrecedence string outboundSyncRuleScopingCondition = ""; string outboundObjectType = ""; string outboundFlowType = ""; - string outboundPrecedence = ""; if (outboundSyncRules.ElementAtOrDefault(i) != null) { @@ -2047,7 +1990,6 @@ orderby inboundSyncRulePrecedence metaverseObjectType = (string)outboundSyncRules.ElementAt(i).Element("sourceObjectType"); outboundConnectorGuid = ((string)outboundSyncRules.ElementAt(i).Element("connector") ?? string.Empty).ToUpperInvariant(); outboundObjectType = (string)outboundSyncRules.ElementAt(i).Element("targetObjectType"); - outboundPrecedence = (string)outboundSyncRules.ElementAt(i).Element("precedence"); outboundConnectorName = (string)config.XPathSelectElement(Documenter.GetConnectorXmlRootXPath(pilotConfig) + "/ma-data[translate(id, '" + Documenter.LowercaseLetters + "', '" + Documenter.UppercaseLetters + "') = '" + outboundConnectorGuid + "']/name"); if (string.IsNullOrEmpty(outboundConnectorName)) { @@ -2089,8 +2031,8 @@ orderby inboundSyncRulePrecedence } } //columns and order - //inboundSyncRuleName, inboundSyncRuleGuid, inboundSyncRuleScopingConditionString, inboundExpression, inboundFlowType, inboundPrecedence, inboundArrow, metaverseAttribute, metaverseObjectType, outboundArrow, outboundPrecedence, outboundConnectorName, outboundConnectorGuid, outboundSyncRuleName, outboundSyncRuleGuid, outboundSyncRuleScopingConditionString, outboundObjectType, outboundFlowType, outboundExpression, targetAttribute - Documenter.AddRow(table, new object[] { inboundSyncRuleName, inboundSyncRuleGuid, inboundSyncRuleScopingConditionString, inboundExpression, inboundFlowType, inboundPrecedence, "→", metaverseAttribute, metaverseObjectType, "→", outboundPrecedence, outboundConnectorName, outboundConnectorGuid, outboundSyncRuleName, outboundSyncRuleGuid, outboundSyncRuleScopingCondition, outboundObjectType, outboundExpression, outboundFlowType, targetAttribute }); + //inboundSyncRuleName, inboundSyncRuleScopingConditionString, inboundExpression, inboundFlowType, inboundArrow, metaverseAttribute, metaverseObjectType, outboundArrow, outboundConnectorName, outboundSyncRuleName, outboundSyncRuleScopingConditionString, outboundObjectType, outboundExpression, outboundFlowType, targetAttribute + Documenter.AddRow(table, new object[] { inboundSyncRuleName, inboundSyncRuleScopingConditionString, inboundExpression, inboundFlowType, "→", metaverseAttribute, metaverseObjectType, "→", outboundConnectorName, outboundSyncRuleName, outboundSyncRuleScopingCondition, outboundObjectType, outboundExpression, outboundFlowType, targetAttribute }); } } } @@ -2135,71 +2077,64 @@ protected DataTable GetConnectorObjectExportAttributeFlowsSummaryHeaderTable() { var headerTable = Documenter.GetHeaderTable(); - //columns and order - doesn't include hidden GUID columns - //inboundSyncRuleName, inboundSyncRuleScopingConditionString, inboundExpression, inboundFlowType, inboundPrecedence, inboundArrow, metaverseAttribute, metaverseObjectType, outboundArrow, outboundPrecedence, outboundConnectorName, outboundSyncRuleName, outboundSyncRuleScopingConditionString, outboundObjectType, outboundFlowType, outboundExpression, targetAttribute - //colWidths - //10 + 1 + 10 + 6 + 5 + 2 + 8 + 5 + 2 + 5 + 10 + 10 + 1 + 5 + 6 + 10 + 7 + //columns and order + //inboundSyncRuleName, inboundSyncRuleScopingConditionString, inboundExpression, inboundFlowType, inboundArrow, metaverseAttribute, metaverseObjectType, outboundArrow, outboundConnectorName, outboundSyncRuleName, outboundSyncRuleScopingConditionString, outboundObjectType, outboundFlowType, outboundExpression, targetAttribute + // Header Row 1 // Import Flows - headerTable.Rows.Add(new OrderedDictionary { { "RowIndex", 0 }, { "ColumnIndex", 0 }, { "ColumnName", "Import Flows" }, { "RowSpan", 1 }, { "ColSpan", 6 }, { "ColWidth", 0 } }.Values.Cast().ToArray()); + headerTable.Rows.Add(new OrderedDictionary { { "RowIndex", 0 }, { "ColumnIndex", 0 }, { "ColumnName", "Import Flows" }, { "RowSpan", 1 }, { "ColSpan", 5 }, { "ColWidth", 0 } }.Values.Cast().ToArray()); // MV Attribute headerTable.Rows.Add(new OrderedDictionary { { "RowIndex", 0 }, { "ColumnIndex", 1 }, { "ColumnName", "Metaverse" }, { "RowSpan", 1 }, { "ColSpan", 3 }, { "ColWidth", 0 } }.Values.Cast().ToArray()); // Export Flows - headerTable.Rows.Add(new OrderedDictionary { { "RowIndex", 0 }, { "ColumnIndex", 2 }, { "ColumnName", "Export Flows" }, { "RowSpan", 1 }, { "ColSpan", 9 }, { "ColWidth", 0 } }.Values.Cast().ToArray()); + headerTable.Rows.Add(new OrderedDictionary { { "RowIndex", 0 }, { "ColumnIndex", 2 }, { "ColumnName", "Export Flows" }, { "RowSpan", 1 }, { "ColSpan", 7 }, { "ColWidth", 0 } }.Values.Cast().ToArray()); // Header Row 2 // Inbound Sync Rule Name - headerTable.Rows.Add(new OrderedDictionary { { "RowIndex", 1 }, { "ColumnIndex", 0 }, { "ColumnName", "Sync Rule" }, { "RowSpan", 1 }, { "ColSpan", 1 }, { "ColWidth", 10 } }.Values.Cast().ToArray()); + headerTable.Rows.Add(new OrderedDictionary { { "RowIndex", 1 }, { "ColumnIndex", 0 }, { "ColumnName", "Inbound Sync Rule" }, { "RowSpan", 1 }, { "ColSpan", 1 }, { "ColWidth", 10 } }.Values.Cast().ToArray()); // Inbound Sync Rule Scoping Condition String - headerTable.Rows.Add(new OrderedDictionary { { "RowIndex", 1 }, { "ColumnIndex", 1 }, { "ColumnName", "Sync Rule Scoping Condition" }, { "RowSpan", 1 }, { "ColSpan", 1 }, { "ColWidth", 10 } }.Values.Cast().ToArray()); + headerTable.Rows.Add(new OrderedDictionary { { "RowIndex", 1 }, { "ColumnIndex", 1 }, { "ColumnName", "Inbound Sync Rule Scoping Condition" }, { "RowSpan", 1 }, { "ColSpan", 1 }, { "ColWidth", 10 } }.Values.Cast().ToArray()); // Inbound Expression - headerTable.Rows.Add(new OrderedDictionary { { "RowIndex", 1 }, { "ColumnIndex", 2 }, { "ColumnName", "Expression" }, { "RowSpan", 1 }, { "ColSpan", 1 }, { "ColWidth", 10 } }.Values.Cast().ToArray()); + headerTable.Rows.Add(new OrderedDictionary { { "RowIndex", 1 }, { "ColumnIndex", 2 }, { "ColumnName", "Inbound Expression" }, { "RowSpan", 1 }, { "ColSpan", 1 }, { "ColWidth", 10 } }.Values.Cast().ToArray()); // Inbound Flow Type - headerTable.Rows.Add(new OrderedDictionary { { "RowIndex", 1 }, { "ColumnIndex", 3 }, { "ColumnName", "Flow Type" }, { "RowSpan", 1 }, { "ColSpan", 1 }, { "ColWidth", 6 } }.Values.Cast().ToArray()); - - // Inbound Precedence - headerTable.Rows.Add(new OrderedDictionary { { "RowIndex", 1 }, { "ColumnIndex", 4 }, { "ColumnName", "Rank" }, { "RowSpan", 1 }, { "ColSpan", 1 }, { "ColWidth", 5 } }.Values.Cast().ToArray()); + headerTable.Rows.Add(new OrderedDictionary { { "RowIndex", 1 }, { "ColumnIndex", 3 }, { "ColumnName", "Inbound Flow Type" }, { "RowSpan", 1 }, { "ColSpan", 1 }, { "ColWidth", 10 } }.Values.Cast().ToArray()); // Inbound Arrow - headerTable.Rows.Add(new OrderedDictionary { { "RowIndex", 1 }, { "ColumnIndex", 5 }, { "ColumnName", "→" }, { "RowSpan", 1 }, { "ColSpan", 1 }, { "ColWidth", 2 } }.Values.Cast().ToArray()); + headerTable.Rows.Add(new OrderedDictionary { { "RowIndex", 1 }, { "ColumnIndex", 4 }, { "ColumnName", "→" }, { "RowSpan", 1 }, { "ColSpan", 1 }, { "ColWidth", 2 } }.Values.Cast().ToArray()); // Metaverse attribute - headerTable.Rows.Add(new OrderedDictionary { { "RowIndex", 1 }, { "ColumnIndex", 6 }, { "ColumnName", "MV Attribute" }, { "RowSpan", 1 }, { "ColSpan", 1 }, { "ColWidth", 8 } }.Values.Cast().ToArray()); + headerTable.Rows.Add(new OrderedDictionary { { "RowIndex", 1 }, { "ColumnIndex", 5 }, { "ColumnName", "Metaverse Attribute" }, { "RowSpan", 1 }, { "ColSpan", 1 }, { "ColWidth", 8 } }.Values.Cast().ToArray()); // Metaverse Object Type - headerTable.Rows.Add(new OrderedDictionary { { "RowIndex", 1 }, { "ColumnIndex", 7 }, { "ColumnName", "MV Object Type" }, { "RowSpan", 1 }, { "ColSpan", 1 }, { "ColWidth", 5 } }.Values.Cast().ToArray()); + headerTable.Rows.Add(new OrderedDictionary { { "RowIndex", 1 }, { "ColumnIndex", 6 }, { "ColumnName", "Metaverse Object Type" }, { "RowSpan", 1 }, { "ColSpan", 1 }, { "ColWidth", 8 } }.Values.Cast().ToArray()); // Outbound Arrow - headerTable.Rows.Add(new OrderedDictionary { { "RowIndex", 1 }, { "ColumnIndex", 8 }, { "ColumnName", "→" }, { "RowSpan", 1 }, { "ColSpan", 1 }, { "ColWidth", 2 } }.Values.Cast().ToArray()); - - // Outbound Precedence - headerTable.Rows.Add(new OrderedDictionary { { "RowIndex", 1 }, { "ColumnIndex", 9 }, { "ColumnName", "Rank" }, { "RowSpan", 1 }, { "ColSpan", 1 }, { "ColWidth", 5 } }.Values.Cast().ToArray()); + headerTable.Rows.Add(new OrderedDictionary { { "RowIndex", 1 }, { "ColumnIndex", 7 }, { "ColumnName", "→" }, { "RowSpan", 1 }, { "ColSpan", 1 }, { "ColWidth", 2 } }.Values.Cast().ToArray()); // Outbound Connector Name - headerTable.Rows.Add(new OrderedDictionary { { "RowIndex", 1 }, { "ColumnIndex", 10 }, { "ColumnName", "Connector" }, { "RowSpan", 1 }, { "ColSpan", 1 }, { "ColWidth", 10 } }.Values.Cast().ToArray()); + headerTable.Rows.Add(new OrderedDictionary { { "RowIndex", 1 }, { "ColumnIndex", 8 }, { "ColumnName", "Outbound Connector" }, { "RowSpan", 1 }, { "ColSpan", 1 }, { "ColWidth", 10 } }.Values.Cast().ToArray()); // Outbound Sync Rule Name - headerTable.Rows.Add(new OrderedDictionary { { "RowIndex", 1 }, { "ColumnIndex", 11 }, { "ColumnName", "Sync Rule" }, { "RowSpan", 1 }, { "ColSpan", 1 }, { "ColWidth", 10 } }.Values.Cast().ToArray()); + headerTable.Rows.Add(new OrderedDictionary { { "RowIndex", 1 }, { "ColumnIndex", 9 }, { "ColumnName", "Outbound Sync Rule" }, { "RowSpan", 1 }, { "ColSpan", 1 }, { "ColWidth", 10 } }.Values.Cast().ToArray()); // Outbound Sync Rule Scoping Condition String - headerTable.Rows.Add(new OrderedDictionary { { "RowIndex", 1 }, { "ColumnIndex", 12 }, { "ColumnName", "Sync Rule Scoping Condition" }, { "RowSpan", 1 }, { "ColSpan", 1 }, { "ColWidth", 10 } }.Values.Cast().ToArray()); + headerTable.Rows.Add(new OrderedDictionary { { "RowIndex", 1 }, { "ColumnIndex", 10 }, { "ColumnName", "Outbound Sync Rule Scoping Condition" }, { "RowSpan", 1 }, { "ColSpan", 1 }, { "ColWidth", 10 } }.Values.Cast().ToArray()); // Outbound Object Type - headerTable.Rows.Add(new OrderedDictionary { { "RowIndex", 1 }, { "ColumnIndex", 13 }, { "ColumnName", "Object Type" }, { "RowSpan", 1 }, { "ColSpan", 1 }, { "ColWidth", 5 } }.Values.Cast().ToArray()); + headerTable.Rows.Add(new OrderedDictionary { { "RowIndex", 1 }, { "ColumnIndex", 11 }, { "ColumnName", "Outbound Object Type" }, { "RowSpan", 1 }, { "ColSpan", 1 }, { "ColWidth", 10 } }.Values.Cast().ToArray()); // Outbound Flow Type - headerTable.Rows.Add(new OrderedDictionary { { "RowIndex", 1 }, { "ColumnIndex", 14 }, { "ColumnName", "Flow Type" }, { "RowSpan", 1 }, { "ColSpan", 1 }, { "ColWidth", 6 } }.Values.Cast().ToArray()); + headerTable.Rows.Add(new OrderedDictionary { { "RowIndex", 1 }, { "ColumnIndex", 12 }, { "ColumnName", "Outbound Flow Type" }, { "RowSpan", 1 }, { "ColSpan", 1 }, { "ColWidth", 10 } }.Values.Cast().ToArray()); // Outbound Expression - headerTable.Rows.Add(new OrderedDictionary { { "RowIndex", 1 }, { "ColumnIndex", 15 }, { "ColumnName", "Expression" }, { "RowSpan", 1 }, { "ColSpan", 1 }, { "ColWidth", 10 } }.Values.Cast().ToArray()); + headerTable.Rows.Add(new OrderedDictionary { { "RowIndex", 1 }, { "ColumnIndex", 13 }, { "ColumnName", "Outbound Expression" }, { "RowSpan", 1 }, { "ColSpan", 1 }, { "ColWidth", 10 } }.Values.Cast().ToArray()); // Target Attribute - headerTable.Rows.Add(new OrderedDictionary { { "RowIndex", 1 }, { "ColumnIndex", 16 }, { "ColumnName", "Target Attribute" }, { "RowSpan", 1 }, { "ColSpan", 1 }, { "ColWidth", 7 } }.Values.Cast().ToArray()); + headerTable.Rows.Add(new OrderedDictionary { { "RowIndex", 1 }, { "ColumnIndex", 14 }, { "ColumnName", "Target Attribute" }, { "RowSpan", 1 }, { "ColSpan", 1 }, { "ColWidth", 10 } }.Values.Cast().ToArray()); headerTable.AcceptChanges(); From ecdf4d92069f4aa8975c6ea313ecef395de68f04 Mon Sep 17 00:00:00 2001 From: FIMTooler Date: Fri, 26 Apr 2024 16:28:51 -0400 Subject: [PATCH 08/10] Revert "Update FlowType to include Constant" This reverts commit 5cb0c5d3d19e36bda67f3d28e71a0292942cccb4. --- .../ConnectorDocumenter.cs | 323 +++++++++++------- 1 file changed, 194 insertions(+), 129 deletions(-) diff --git a/src/AzureADConnectSyncDocumenter/ConnectorDocumenter.cs b/src/AzureADConnectSyncDocumenter/ConnectorDocumenter.cs index 0caab92..43b9cbb 100644 --- a/src/AzureADConnectSyncDocumenter/ConnectorDocumenter.cs +++ b/src/AzureADConnectSyncDocumenter/ConnectorDocumenter.cs @@ -1,4 +1,4 @@ -//------------------------------------------------------------------------------------------------------------------------------------------ +//------------------------------------------------------------------------------------------------------------------------------------------ // // Copyright (c) Microsoft. All Rights Reserved. // Licensed under the MIT license. See LICENSE.txt file in the project root for full license information. @@ -1252,25 +1252,33 @@ protected void CreateConnectorObjectImportAttributeFlowsSummaryDataSets() { Logger.Instance.WriteMethodEntry(); //columns and order - //inboundSyncRuleName, inboundSyncRuleScopingConditionString, inboundExpression, inboundFlowType, inboundArrow, metaverseAttribute, metaverseObjectType, outboundArrow, outboundConnectorName, outboundSyncRuleName, outboundSyncRuleScopingConditionString, outboundObjectType, outboundExpression, outboundFlowType, targetAttribute + //inboundSyncRuleName, inboundSyncRuleGuid inboundSyncRuleScopingConditionString, inboundExpression, inboundFlowType, inboundPrecedence, inboundArrow, metaverseAttribute, metaverseObjectType, outboundArrow, outboundPrecedence, outboundConnectorName, outboundConnectorGuid, outboundSyncRuleName, outboundSyncRuleGuid outboundSyncRuleScopingConditionString, outboundObjectType, outboundFlowType, outboundExpression, targetAttribute try { - var table = new DataTable("ImportSummary") { Locale = CultureInfo.InvariantCulture }; + var table = new DataTable("customizedImportSummary") { Locale = CultureInfo.InvariantCulture }; var column1 = new DataColumn("inboundSyncRuleName"); - var column2 = new DataColumn("inboundSyncRuleScopingConditionString"); - var column3 = new DataColumn("inboundExpression"); - var column4 = new DataColumn("inboundFlowType"); - var column5 = new DataColumn("inboundArrow"); - var column6 = new DataColumn("metaverseAttribute"); - var column7 = new DataColumn("metaverseObjectType"); - var column8 = new DataColumn("outboundArrow"); - var column9 = new DataColumn("outboundConnectorName"); - var column10 = new DataColumn("outboundSyncRuleName"); - var column11 = new DataColumn("outboundSyncRuleScopingConditionString"); - var column12 = new DataColumn("outboundObjectType"); - var column13 = new DataColumn("outboundExpression"); - var column14 = new DataColumn("outboundFlowType"); - var column15 = new DataColumn("targetAttribute"); + //required for bookmarks + var column2 = new DataColumn("inboundSyncRuleGuid"); + var column3 = new DataColumn("inboundSyncRuleScopingConditionString"); + var column4 = new DataColumn("inboundExpression"); + var column5 = new DataColumn("inboundFlowType"); + var column6 = new DataColumn("inboundPrecedence"); + var column7 = new DataColumn("inboundArrow"); + var column8 = new DataColumn("metaverseAttribute"); + var column9 = new DataColumn("metaverseObjectType"); + var column10 = new DataColumn("outboundArrow"); + var column11 = new DataColumn("outboundPrecedence"); + var column12 = new DataColumn("outboundConnectorName"); + //required for bookmarks + var column13 = new DataColumn("outboundConnectorGuid"); + var column14 = new DataColumn("outboundSyncRuleName"); + //required for bookmarks + var column15 = new DataColumn("outboundSyncRuleGuid"); + var column16 = new DataColumn("outboundSyncRuleScopingConditionString"); + var column17 = new DataColumn("outboundObjectType"); + var column18 = new DataColumn("outboundFlowType"); + var column19 = new DataColumn("outboundExpression"); + var column20 = new DataColumn("targetAttribute"); table.Columns.Add(column1); table.Columns.Add(column2); @@ -1287,7 +1295,12 @@ protected void CreateConnectorObjectImportAttributeFlowsSummaryDataSets() table.Columns.Add(column13); table.Columns.Add(column14); table.Columns.Add(column15); - table.PrimaryKey = new[] { column1, column2, column3, column4, column5, column6, column7, column8, column9, column10, column11, column12, column13, column14, column15 }; + table.Columns.Add(column16); + table.Columns.Add(column17); + table.Columns.Add(column18); + table.Columns.Add(column19); + table.Columns.Add(column20); + table.PrimaryKey = new[] { column1, column2, column3, column4, column5, column6, column7, column8, column9, column10, column11, column12, column13, column14, column15, column16, column17, column18, column19, column20 }; this.PilotDataSet = new DataSet("ImportAttributeFlowsSummary") { Locale = CultureInfo.InvariantCulture }; this.PilotDataSet.Tables.Add(table); @@ -1315,52 +1328,67 @@ protected DataTable GetConnectorObjectImportAttributeFlowsSummaryPrintTable() { var printTable = Documenter.GetPrintTable(); //columns and order - //inboundSyncRuleName, inboundSyncRuleScopingConditionString, inboundExpression, inboundFlowType, inboundArrow, metaverseAttribute, metaverseObjectType, outboundArrow, outboundConnectorName, outboundSyncRuleName, outboundSyncRuleScopingConditionString, outboundObjectType, outboundExpression, outboundFlowType,targetAttribute + //inboundSyncRuleName, inboundSyncRuleGuid inboundSyncRuleScopingConditionString, inboundExpression, inboundFlowType, inboundPrecedence, inboundArrow, metaverseAttribute, metaverseObjectType, outboundArrow, outboundPrecedence, outboundConnectorName, outboundConnectorGuid, outboundSyncRuleName, outboundSyncRuleGuid outboundSyncRuleScopingConditionString, outboundObjectType, outboundFlowType, outboundExpression, targetAttribute // Inbound Sync Rule Name - printTable.Rows.Add(new OrderedDictionary { { "TableIndex", 0 }, { "ColumnIndex", 0 }, { "Hidden", false }, { "SortOrder", -1 }, { "BookmarkIndex", -1 }, { "JumpToBookmarkIndex", 5 }, { "ChangeIgnored", false } }.Values.Cast().ToArray()); + printTable.Rows.Add(new OrderedDictionary { { "TableIndex", 0 }, { "ColumnIndex", 0 }, { "Hidden", false }, { "SortOrder", -1 }, { "BookmarkIndex", -1 }, { "JumpToBookmarkIndex", 1 }, { "ChangeIgnored", false } }.Values.Cast().ToArray()); + + // Inbound Sync Rule Guid - required for bookmarks + printTable.Rows.Add(new OrderedDictionary { { "TableIndex", 0 }, { "ColumnIndex", 1 }, { "Hidden", true }, { "SortOrder", -1 }, { "BookmarkIndex", -1 }, { "JumpToBookmarkIndex", -1 }, { "ChangeIgnored", false } }.Values.Cast().ToArray()); // Inbound Sync Rule Scoping Condition String - printTable.Rows.Add(new OrderedDictionary { { "TableIndex", 0 }, { "ColumnIndex", 1 }, { "Hidden", false }, { "SortOrder", -1 }, { "BookmarkIndex", -1 }, { "JumpToBookmarkIndex", -1 }, { "ChangeIgnored", false } }.Values.Cast().ToArray()); + printTable.Rows.Add(new OrderedDictionary { { "TableIndex", 0 }, { "ColumnIndex", 2 }, { "Hidden", false }, { "SortOrder", -1 }, { "BookmarkIndex", -1 }, { "JumpToBookmarkIndex", -1 }, { "ChangeIgnored", false } }.Values.Cast().ToArray()); // Inbound Expression - printTable.Rows.Add(new OrderedDictionary { { "TableIndex", 0 }, { "ColumnIndex", 2 }, { "Hidden", false }, { "SortOrder", -1 }, { "BookmarkIndex", -1 }, { "JumpToBookmarkIndex", -1 }, { "ChangeIgnored", false } }.Values.Cast().ToArray()); + printTable.Rows.Add(new OrderedDictionary { { "TableIndex", 0 }, { "ColumnIndex", 3 }, { "Hidden", false }, { "SortOrder", -1 }, { "BookmarkIndex", -1 }, { "JumpToBookmarkIndex", -1 }, { "ChangeIgnored", false } }.Values.Cast().ToArray()); // Inbound Flow Type - printTable.Rows.Add(new OrderedDictionary { { "TableIndex", 0 }, { "ColumnIndex", 3 }, { "Hidden", false }, { "SortOrder", -1 }, { "BookmarkIndex", -1 }, { "JumpToBookmarkIndex", -1 }, { "ChangeIgnored", true } }.Values.Cast().ToArray()); + printTable.Rows.Add(new OrderedDictionary { { "TableIndex", 0 }, { "ColumnIndex", 4 }, { "Hidden", false }, { "SortOrder", -1 }, { "BookmarkIndex", -1 }, { "JumpToBookmarkIndex", -1 }, { "ChangeIgnored", true } }.Values.Cast().ToArray()); + + // Inbound Precedence + printTable.Rows.Add(new OrderedDictionary { { "TableIndex", 0 }, { "ColumnIndex", 5 }, { "Hidden", false }, { "SortOrder", -1 }, { "BookmarkIndex", -1 }, { "JumpToBookmarkIndex", -1 }, { "ChangeIgnored", true } }.Values.Cast().ToArray()); // Inbound Arrow - printTable.Rows.Add(new OrderedDictionary { { "TableIndex", 0 }, { "ColumnIndex", 4 }, { "Hidden", false }, { "SortOrder", -1 }, { "BookmarkIndex", -1 }, { "JumpToBookmarkIndex", -1 }, { "ChangeIgnored", true } }.Values.Cast().ToArray()); + printTable.Rows.Add(new OrderedDictionary { { "TableIndex", 0 }, { "ColumnIndex", 6 }, { "Hidden", false }, { "SortOrder", -1 }, { "BookmarkIndex", -1 }, { "JumpToBookmarkIndex", -1 }, { "ChangeIgnored", true } }.Values.Cast().ToArray()); // Metaverse Attribute - printTable.Rows.Add(new OrderedDictionary { { "TableIndex", 0 }, { "ColumnIndex", 5 }, { "Hidden", false }, { "SortOrder", 0 }, { "BookmarkIndex", -1 }, { "JumpToBookmarkIndex", -1 }, { "ChangeIgnored", false } }.Values.Cast().ToArray()); + printTable.Rows.Add(new OrderedDictionary { { "TableIndex", 0 }, { "ColumnIndex", 7 }, { "Hidden", false }, { "SortOrder", 0 }, { "BookmarkIndex", -1 }, { "JumpToBookmarkIndex", -1 }, { "ChangeIgnored", false } }.Values.Cast().ToArray()); // Metaverse Object Type - printTable.Rows.Add(new OrderedDictionary { { "TableIndex", 0 }, { "ColumnIndex", 6 }, { "Hidden", false }, { "SortOrder", 0 }, { "BookmarkIndex", -1 }, { "JumpToBookmarkIndex", -1 }, { "ChangeIgnored", false } }.Values.Cast().ToArray()); + printTable.Rows.Add(new OrderedDictionary { { "TableIndex", 0 }, { "ColumnIndex", 8 }, { "Hidden", false }, { "SortOrder", 0 }, { "BookmarkIndex", -1 }, { "JumpToBookmarkIndex", -1 }, { "ChangeIgnored", false } }.Values.Cast().ToArray()); // Outbound Arrow - printTable.Rows.Add(new OrderedDictionary { { "TableIndex", 0 }, { "ColumnIndex", 7 }, { "Hidden", false }, { "SortOrder", -1 }, { "BookmarkIndex", -1 }, { "JumpToBookmarkIndex", -1 }, { "ChangeIgnored", true } }.Values.Cast().ToArray()); + printTable.Rows.Add(new OrderedDictionary { { "TableIndex", 0 }, { "ColumnIndex", 9 }, { "Hidden", false }, { "SortOrder", -1 }, { "BookmarkIndex", -1 }, { "JumpToBookmarkIndex", -1 }, { "ChangeIgnored", true } }.Values.Cast().ToArray()); + + // Outbound Precedence + printTable.Rows.Add(new OrderedDictionary { { "TableIndex", 0 }, { "ColumnIndex", 10 }, { "Hidden", false }, { "SortOrder", -1 }, { "BookmarkIndex", -1 }, { "JumpToBookmarkIndex", -1 }, { "ChangeIgnored", false } }.Values.Cast().ToArray()); // Outbound Connector Name - printTable.Rows.Add(new OrderedDictionary { { "TableIndex", 0 }, { "ColumnIndex", 8 }, { "Hidden", false }, { "SortOrder", -1 }, { "BookmarkIndex", -1 }, { "JumpToBookmarkIndex", 8 }, { "ChangeIgnored", false } }.Values.Cast().ToArray()); + printTable.Rows.Add(new OrderedDictionary { { "TableIndex", 0 }, { "ColumnIndex", 11 }, { "Hidden", false }, { "SortOrder", -1 }, { "BookmarkIndex", -1 }, { "JumpToBookmarkIndex", 12 }, { "ChangeIgnored", false } }.Values.Cast().ToArray()); + + // Outbound Connector Guid - required for bookmarks + printTable.Rows.Add(new OrderedDictionary { { "TableIndex", 0 }, { "ColumnIndex", 12 }, { "Hidden", true }, { "SortOrder", -1 }, { "BookmarkIndex", -1 }, { "JumpToBookmarkIndex", -1 }, { "ChangeIgnored", false } }.Values.Cast().ToArray()); // Outbound Sync Rule Name - printTable.Rows.Add(new OrderedDictionary { { "TableIndex", 0 }, { "ColumnIndex", 9 }, { "Hidden", false }, { "SortOrder", -1 }, { "BookmarkIndex", -1 }, { "JumpToBookmarkIndex", 9 }, { "ChangeIgnored", false } }.Values.Cast().ToArray()); + printTable.Rows.Add(new OrderedDictionary { { "TableIndex", 0 }, { "ColumnIndex", 13 }, { "Hidden", false }, { "SortOrder", -1 }, { "BookmarkIndex", -1 }, { "JumpToBookmarkIndex", 14 }, { "ChangeIgnored", false } }.Values.Cast().ToArray()); + + // Outbound Sync Rule Guid - required for bookmarks + printTable.Rows.Add(new OrderedDictionary { { "TableIndex", 0 }, { "ColumnIndex", 14 }, { "Hidden", true }, { "SortOrder", -1 }, { "BookmarkIndex", -1 }, { "JumpToBookmarkIndex", -1 }, { "ChangeIgnored", false } }.Values.Cast().ToArray()); // Outbound Sync Rule Scoping Condition String - printTable.Rows.Add(new OrderedDictionary { { "TableIndex", 0 }, { "ColumnIndex", 10 }, { "Hidden", false }, { "SortOrder", -1 }, { "BookmarkIndex", -1 }, { "JumpToBookmarkIndex", -1 }, { "ChangeIgnored", false } }.Values.Cast().ToArray()); + printTable.Rows.Add(new OrderedDictionary { { "TableIndex", 0 }, { "ColumnIndex", 15 }, { "Hidden", false }, { "SortOrder", -1 }, { "BookmarkIndex", -1 }, { "JumpToBookmarkIndex", -1 }, { "ChangeIgnored", false } }.Values.Cast().ToArray()); // Outbound Object Type - printTable.Rows.Add(new OrderedDictionary { { "TableIndex", 0 }, { "ColumnIndex", 11 }, { "Hidden", false }, { "SortOrder", -1 }, { "BookmarkIndex", -1 }, { "JumpToBookmarkIndex", -1 }, { "ChangeIgnored", false } }.Values.Cast().ToArray()); - - // Outbound Expression - printTable.Rows.Add(new OrderedDictionary { { "TableIndex", 0 }, { "ColumnIndex", 12 }, { "Hidden", false }, { "SortOrder", -1 }, { "BookmarkIndex", -1 }, { "JumpToBookmarkIndex", -1 }, { "ChangeIgnored", false } }.Values.Cast().ToArray()); + printTable.Rows.Add(new OrderedDictionary { { "TableIndex", 0 }, { "ColumnIndex", 16 }, { "Hidden", false }, { "SortOrder", -1 }, { "BookmarkIndex", -1 }, { "JumpToBookmarkIndex", -1 }, { "ChangeIgnored", false } }.Values.Cast().ToArray()); // Outbound Flow Type - printTable.Rows.Add(new OrderedDictionary { { "TableIndex", 0 }, { "ColumnIndex", 13 }, { "Hidden", false }, { "SortOrder", -1 }, { "BookmarkIndex", -1 }, { "JumpToBookmarkIndex", -1 }, { "ChangeIgnored", true } }.Values.Cast().ToArray()); + printTable.Rows.Add(new OrderedDictionary { { "TableIndex", 0 }, { "ColumnIndex", 17 }, { "Hidden", false }, { "SortOrder", -1 }, { "BookmarkIndex", -1 }, { "JumpToBookmarkIndex", -1 }, { "ChangeIgnored", true } }.Values.Cast().ToArray()); + + // Outbound Expression + printTable.Rows.Add(new OrderedDictionary { { "TableIndex", 0 }, { "ColumnIndex", 18 }, { "Hidden", false }, { "SortOrder", -1 }, { "BookmarkIndex", -1 }, { "JumpToBookmarkIndex", -1 }, { "ChangeIgnored", false } }.Values.Cast().ToArray()); // Target Attribute - printTable.Rows.Add(new OrderedDictionary { { "TableIndex", 0 }, { "ColumnIndex", 14 }, { "Hidden", false }, { "SortOrder", -1 }, { "BookmarkIndex", -1 }, { "JumpToBookmarkIndex", -1 }, { "ChangeIgnored", false } }.Values.Cast().ToArray()); + printTable.Rows.Add(new OrderedDictionary { { "TableIndex", 0 }, { "ColumnIndex", 19 }, { "Hidden", false }, { "SortOrder", -1 }, { "BookmarkIndex", -1 }, { "JumpToBookmarkIndex", -1 }, { "ChangeIgnored", false } }.Values.Cast().ToArray()); printTable.AcceptChanges(); @@ -1379,7 +1407,7 @@ protected DataTable GetConnectorObjectImportAttributeFlowsSummaryPrintTable() protected void FillConnectorObjectImportAttributeFlowsSummary(bool pilotConfig) { //columns and order - //inboundSyncRuleName, inboundSyncRuleScopingConditionString, inboundExpression, inboundFlowType, inboundArrow, metaverseAttribute, metaverseObjectType, outboundArrow, outboundConnectorName, outboundSyncRuleName, outboundSyncRuleScopingConditionString, outboundObjectType, outboundExpression, outboundFlowType, targetAttribute + //inboundSyncRuleName, inboundSyncRuleGuid inboundSyncRuleScopingConditionString, inboundExpression, inboundFlowType, inboundPrecedence, inboundArrow, metaverseAttribute, metaverseObjectType, outboundArrow, outboundPrecedence, outboundConnectorName, outboundConnectorGuid, outboundSyncRuleName, outboundSyncRuleGuid outboundSyncRuleScopingConditionString, outboundObjectType, outboundFlowType, outboundExpression, targetAttribute Logger.Instance.WriteMethodEntry("Pilot Config: '{0}'.", pilotConfig); try @@ -1450,26 +1478,21 @@ orderby outboundSyncRulePrecedence string inboundExpression = ""; string inboundSyncRuleScopingConditionString = ""; string inboundFlowType = ""; + string inboundPrecedence = ""; if (inboundSyncRules.ElementAtOrDefault(i) != null) { inboundSyncRuleName = (string)inboundSyncRules.ElementAt(i).Element("name"); inboundSyncRuleGuid = (string)inboundSyncRules.ElementAt(i).Element("id"); metaverseObjectType = (string)inboundSyncRules.ElementAt(i).Element("targetObjectType"); + inboundPrecedence = (string)inboundSyncRules.ElementAt(i).Element("precedence"); ++inboundSyncRuleRank; - if (inboundSyncRules.ElementAt(i).XPathSelectElements("./attribute-mappings/mapping[dest = '" + metaverseAttribute + "']").Count() > 1) - { - string s = ""; - } var transformation = inboundSyncRules.ElementAt(i).XPathSelectElement("./attribute-mappings/mapping[dest = '" + metaverseAttribute + "']"); - //Expression expression = (string)transformation.Element("expression"); - //Direct srcAttribute = (string)transformation.XPathSelectElement("src/attr"); - //Constant var src = (string)transformation.XPathSelectElement("src"); inboundExpression = !string.IsNullOrEmpty(expression) ? expression : !string.IsNullOrEmpty(srcAttribute) ? srcAttribute : src; - inboundFlowType = !string.IsNullOrEmpty(expression) ? "Expression" : !string.IsNullOrEmpty(srcAttribute) ? "Direct" : "Constant"; + inboundFlowType = !string.IsNullOrEmpty(expression) ? "Expression" : "Direct"; var inboundSyncRuleScopingConditions = inboundSyncRules.ElementAt(i).XPathSelectElements("./synchronizationCriteria/conditions"); var inboundSyncRuleScopingConditionsCount = inboundSyncRuleScopingConditions.Count(); @@ -1500,6 +1523,7 @@ orderby outboundSyncRulePrecedence string outboundSyncRuleScopingCondition = ""; string outboundObjectType = ""; string outboundFlowType = ""; + string outboundPrecedence = ""; if (outboundSyncRules.ElementAtOrDefault(i) != null) { outboundSyncRuleName = (string)outboundSyncRules.ElementAt(i).Element("name"); @@ -1507,6 +1531,7 @@ orderby outboundSyncRulePrecedence metaverseObjectType = (string)outboundSyncRules.ElementAt(i).Element("sourceObjectType"); outboundConnectorGuid = ((string)outboundSyncRules.ElementAt(i).Element("connector") ?? string.Empty).ToUpperInvariant(); outboundObjectType = (string)outboundSyncRules.ElementAt(i).Element("targetObjectType"); + outboundPrecedence = (string)outboundSyncRules.ElementAt(i).Element("precedence"); outboundConnectorName = (string)config.XPathSelectElement(Documenter.GetConnectorXmlRootXPath(pilotConfig) + "/ma-data[translate(id, '" + Documenter.LowercaseLetters + "', '" + Documenter.UppercaseLetters + "') = '" + outboundConnectorGuid + "']/name"); if (string.IsNullOrEmpty(outboundConnectorName)) { @@ -1547,8 +1572,8 @@ orderby outboundSyncRulePrecedence } } //columns and order - //inboundSyncRuleName, inboundSyncRuleScopingConditionString, inboundExpression, inboundFlowType, inboundArrow, metaverseAttribute, metaverseObjectType, outboundArrow, outboundConnectorName, outboundSyncRuleName, outboundSyncRuleScopingConditionString, outboundObjectType, outboundExpression, outboundFlowType, targetAttribute - Documenter.AddRow(table, new object[] { inboundSyncRuleName, inboundSyncRuleScopingConditionString, inboundExpression, inboundFlowType, "→", metaverseAttribute, metaverseObjectType, "→", outboundConnectorName, outboundSyncRuleName, outboundSyncRuleScopingCondition, outboundObjectType, outboundExpression, outboundFlowType, targetAttribute }); + //inboundSyncRuleName, inboundSyncRuleGuid inboundSyncRuleScopingConditionString, inboundExpression, inboundFlowType, inboundPrecedence, inboundArrow, metaverseAttribute, metaverseObjectType, outboundArrow, outboundPrecedence, outboundConnectorName, outboundConnectorGuid, outboundSyncRuleName, outboundSyncRuleGuid outboundSyncRuleScopingConditionString, outboundObjectType, outboundFlowType, outboundExpression, targetAttribute + Documenter.AddRow(table, new object[] { inboundSyncRuleName, inboundSyncRuleGuid, inboundSyncRuleScopingConditionString, inboundExpression, inboundFlowType, inboundPrecedence, "→", metaverseAttribute, metaverseObjectType, "→", outboundPrecedence, outboundConnectorName, outboundConnectorGuid, outboundSyncRuleName, outboundSyncRuleGuid, outboundSyncRuleScopingCondition, outboundObjectType, outboundFlowType, outboundExpression, targetAttribute }); } } } @@ -1593,64 +1618,71 @@ protected DataTable GetConnectorObjectImportAttributeFlowsSummaryHeaderTable() { var headerTable = Documenter.GetHeaderTable(); - //columns and order - //inboundSyncRuleName, inboundSyncRuleScopingConditionString, inboundExpression, inboundFlowType, inboundArrow, metaverseAttribute, metaverseObjectType, outboundArrow, outboundConnectorName, outboundSyncRuleName, outboundSyncRuleScopingConditionString, outboundObjectType, outboundFlowType, outboundExpression, targetAttribute - + //columns and order - doesn't include hidden GUID columns + //inboundSyncRuleName, inboundSyncRuleScopingConditionString, inboundExpression, inboundFlowType, inboundPrecedence, inboundArrow, metaverseAttribute, metaverseObjectType, outboundArrow, outboundPrecedence, outboundConnectorName, outboundSyncRuleName, outboundSyncRuleScopingConditionString, outboundObjectType, outboundFlowType, outboundExpression, targetAttribute + //colWidths + //10 + 1 + 10 + 6 + 5 + 2 + 8 + 5 + 2 + 5 + 10 + 10 + 1 + 5 + 6 + 10 + 7 // Header Row 1 // Import Flows - headerTable.Rows.Add(new OrderedDictionary { { "RowIndex", 0 }, { "ColumnIndex", 0 }, { "ColumnName", "Import Flows" }, { "RowSpan", 1 }, { "ColSpan", 5 }, { "ColWidth", 0 } }.Values.Cast().ToArray()); + headerTable.Rows.Add(new OrderedDictionary { { "RowIndex", 0 }, { "ColumnIndex", 0 }, { "ColumnName", "Import Flows" }, { "RowSpan", 1 }, { "ColSpan", 6 }, { "ColWidth", 0 } }.Values.Cast().ToArray()); // MV Attribute headerTable.Rows.Add(new OrderedDictionary { { "RowIndex", 0 }, { "ColumnIndex", 1 }, { "ColumnName", "Metaverse" }, { "RowSpan", 1 }, { "ColSpan", 3 }, { "ColWidth", 0 } }.Values.Cast().ToArray()); // Export Flows - headerTable.Rows.Add(new OrderedDictionary { { "RowIndex", 0 }, { "ColumnIndex", 2 }, { "ColumnName", "Export Flows" }, { "RowSpan", 1 }, { "ColSpan", 7 }, { "ColWidth", 0 } }.Values.Cast().ToArray()); + headerTable.Rows.Add(new OrderedDictionary { { "RowIndex", 0 }, { "ColumnIndex", 2 }, { "ColumnName", "Export Flows" }, { "RowSpan", 1 }, { "ColSpan", 9 }, { "ColWidth", 0 } }.Values.Cast().ToArray()); // Header Row 2 // Inbound Sync Rule Name - headerTable.Rows.Add(new OrderedDictionary { { "RowIndex", 1 }, { "ColumnIndex", 0 }, { "ColumnName", "Inbound Sync Rule" }, { "RowSpan", 1 }, { "ColSpan", 1 }, { "ColWidth", 10 } }.Values.Cast().ToArray()); + headerTable.Rows.Add(new OrderedDictionary { { "RowIndex", 1 }, { "ColumnIndex", 0 }, { "ColumnName", "Sync Rule" }, { "RowSpan", 1 }, { "ColSpan", 1 }, { "ColWidth", 10 } }.Values.Cast().ToArray()); // Inbound Sync Rule Scoping Condition String - headerTable.Rows.Add(new OrderedDictionary { { "RowIndex", 1 }, { "ColumnIndex", 1 }, { "ColumnName", "Inbound Sync Rule Scoping Condition" }, { "RowSpan", 1 }, { "ColSpan", 1 }, { "ColWidth", 10 } }.Values.Cast().ToArray()); + headerTable.Rows.Add(new OrderedDictionary { { "RowIndex", 1 }, { "ColumnIndex", 1 }, { "ColumnName", "Sync Rule Scoping Condition" }, { "RowSpan", 1 }, { "ColSpan", 1 }, { "ColWidth", 10 } }.Values.Cast().ToArray()); // Inbound Expression - headerTable.Rows.Add(new OrderedDictionary { { "RowIndex", 1 }, { "ColumnIndex", 2 }, { "ColumnName", "Inbound Expression" }, { "RowSpan", 1 }, { "ColSpan", 1 }, { "ColWidth", 10 } }.Values.Cast().ToArray()); + headerTable.Rows.Add(new OrderedDictionary { { "RowIndex", 1 }, { "ColumnIndex", 2 }, { "ColumnName", "Expression" }, { "RowSpan", 1 }, { "ColSpan", 1 }, { "ColWidth", 10 } }.Values.Cast().ToArray()); // Inbound Flow Type - headerTable.Rows.Add(new OrderedDictionary { { "RowIndex", 1 }, { "ColumnIndex", 3 }, { "ColumnName", "Inbound Flow Type" }, { "RowSpan", 1 }, { "ColSpan", 1 }, { "ColWidth", 10 } }.Values.Cast().ToArray()); + headerTable.Rows.Add(new OrderedDictionary { { "RowIndex", 1 }, { "ColumnIndex", 3 }, { "ColumnName", "Flow Type" }, { "RowSpan", 1 }, { "ColSpan", 1 }, { "ColWidth", 6 } }.Values.Cast().ToArray()); + + // Inbound Precedence + headerTable.Rows.Add(new OrderedDictionary { { "RowIndex", 1 }, { "ColumnIndex", 4 }, { "ColumnName", "Rank" }, { "RowSpan", 1 }, { "ColSpan", 1 }, { "ColWidth", 5 } }.Values.Cast().ToArray()); // Inbound Arrow - headerTable.Rows.Add(new OrderedDictionary { { "RowIndex", 1 }, { "ColumnIndex", 4 }, { "ColumnName", "→" }, { "RowSpan", 1 }, { "ColSpan", 1 }, { "ColWidth", 2 } }.Values.Cast().ToArray()); + headerTable.Rows.Add(new OrderedDictionary { { "RowIndex", 1 }, { "ColumnIndex", 5 }, { "ColumnName", "→" }, { "RowSpan", 1 }, { "ColSpan", 1 }, { "ColWidth", 2 } }.Values.Cast().ToArray()); // Metaverse attribute - headerTable.Rows.Add(new OrderedDictionary { { "RowIndex", 1 }, { "ColumnIndex", 5 }, { "ColumnName", "Metaverse Attribute" }, { "RowSpan", 1 }, { "ColSpan", 1 }, { "ColWidth", 8 } }.Values.Cast().ToArray()); + headerTable.Rows.Add(new OrderedDictionary { { "RowIndex", 1 }, { "ColumnIndex", 6 }, { "ColumnName", "MV Attribute" }, { "RowSpan", 1 }, { "ColSpan", 1 }, { "ColWidth", 8 } }.Values.Cast().ToArray()); // Metaverse Object Type - headerTable.Rows.Add(new OrderedDictionary { { "RowIndex", 1 }, { "ColumnIndex", 6 }, { "ColumnName", "Metaverse Object Type" }, { "RowSpan", 1 }, { "ColSpan", 1 }, { "ColWidth", 8 } }.Values.Cast().ToArray()); + headerTable.Rows.Add(new OrderedDictionary { { "RowIndex", 1 }, { "ColumnIndex", 7 }, { "ColumnName", "MV Object Type" }, { "RowSpan", 1 }, { "ColSpan", 1 }, { "ColWidth", 5 } }.Values.Cast().ToArray()); // Outbound Arrow - headerTable.Rows.Add(new OrderedDictionary { { "RowIndex", 1 }, { "ColumnIndex", 7 }, { "ColumnName", "→" }, { "RowSpan", 1 }, { "ColSpan", 1 }, { "ColWidth", 2 } }.Values.Cast().ToArray()); + headerTable.Rows.Add(new OrderedDictionary { { "RowIndex", 1 }, { "ColumnIndex", 8 }, { "ColumnName", "→" }, { "RowSpan", 1 }, { "ColSpan", 1 }, { "ColWidth", 2 } }.Values.Cast().ToArray()); + + // Outbound Precedence + headerTable.Rows.Add(new OrderedDictionary { { "RowIndex", 1 }, { "ColumnIndex", 9 }, { "ColumnName", "Rank" }, { "RowSpan", 1 }, { "ColSpan", 1 }, { "ColWidth", 5 } }.Values.Cast().ToArray()); // Outbound Connector Name - headerTable.Rows.Add(new OrderedDictionary { { "RowIndex", 1 }, { "ColumnIndex", 8 }, { "ColumnName", "Outbound Connector" }, { "RowSpan", 1 }, { "ColSpan", 1 }, { "ColWidth", 10 } }.Values.Cast().ToArray()); + headerTable.Rows.Add(new OrderedDictionary { { "RowIndex", 1 }, { "ColumnIndex", 10 }, { "ColumnName", "Connector" }, { "RowSpan", 1 }, { "ColSpan", 1 }, { "ColWidth", 10 } }.Values.Cast().ToArray()); // Outbound Sync Rule Name - headerTable.Rows.Add(new OrderedDictionary { { "RowIndex", 1 }, { "ColumnIndex", 9 }, { "ColumnName", "Outbound Sync Rule" }, { "RowSpan", 1 }, { "ColSpan", 1 }, { "ColWidth", 10 } }.Values.Cast().ToArray()); + headerTable.Rows.Add(new OrderedDictionary { { "RowIndex", 1 }, { "ColumnIndex", 11 }, { "ColumnName", "Sync Rule" }, { "RowSpan", 1 }, { "ColSpan", 1 }, { "ColWidth", 10 } }.Values.Cast().ToArray()); // Outbound Sync Rule Scoping Condition String - headerTable.Rows.Add(new OrderedDictionary { { "RowIndex", 1 }, { "ColumnIndex", 10 }, { "ColumnName", "Outbound Sync Rule Scoping Condition" }, { "RowSpan", 1 }, { "ColSpan", 1 }, { "ColWidth", 10 } }.Values.Cast().ToArray()); + headerTable.Rows.Add(new OrderedDictionary { { "RowIndex", 1 }, { "ColumnIndex", 12 }, { "ColumnName", "Sync Rule Scoping Condition" }, { "RowSpan", 1 }, { "ColSpan", 1 }, { "ColWidth", 10 } }.Values.Cast().ToArray()); // Outbound Object Type - headerTable.Rows.Add(new OrderedDictionary { { "RowIndex", 1 }, { "ColumnIndex", 11 }, { "ColumnName", "Outbound Object Type" }, { "RowSpan", 1 }, { "ColSpan", 1 }, { "ColWidth", 10 } }.Values.Cast().ToArray()); + headerTable.Rows.Add(new OrderedDictionary { { "RowIndex", 1 }, { "ColumnIndex", 13 }, { "ColumnName", "Object Type" }, { "RowSpan", 1 }, { "ColSpan", 1 }, { "ColWidth", 5 } }.Values.Cast().ToArray()); // Outbound Flow Type - headerTable.Rows.Add(new OrderedDictionary { { "RowIndex", 1 }, { "ColumnIndex", 12 }, { "ColumnName", "Outbound Flow Type" }, { "RowSpan", 1 }, { "ColSpan", 1 }, { "ColWidth", 10 } }.Values.Cast().ToArray()); + headerTable.Rows.Add(new OrderedDictionary { { "RowIndex", 1 }, { "ColumnIndex", 14 }, { "ColumnName", "Flow Type" }, { "RowSpan", 1 }, { "ColSpan", 1 }, { "ColWidth", 6 } }.Values.Cast().ToArray()); // Outbound Expression - headerTable.Rows.Add(new OrderedDictionary { { "RowIndex", 1 }, { "ColumnIndex", 13 }, { "ColumnName", "Outbound Expression" }, { "RowSpan", 1 }, { "ColSpan", 1 }, { "ColWidth", 10 } }.Values.Cast().ToArray()); + headerTable.Rows.Add(new OrderedDictionary { { "RowIndex", 1 }, { "ColumnIndex", 15 }, { "ColumnName", "Expression" }, { "RowSpan", 1 }, { "ColSpan", 1 }, { "ColWidth", 10 } }.Values.Cast().ToArray()); // Target Attribute - headerTable.Rows.Add(new OrderedDictionary { { "RowIndex", 1 }, { "ColumnIndex", 14 }, { "ColumnName", "Target Attribute" }, { "RowSpan", 1 }, { "ColSpan", 1 }, { "ColWidth", 10 } }.Values.Cast().ToArray()); + headerTable.Rows.Add(new OrderedDictionary { { "RowIndex", 1 }, { "ColumnIndex", 16 }, { "ColumnName", "Target Attribute" }, { "RowSpan", 1 }, { "ColSpan", 1 }, { "ColWidth", 7 } }.Values.Cast().ToArray()); headerTable.AcceptChanges(); @@ -1722,25 +1754,33 @@ protected void CreateConnectorObjectExportAttributeFlowsSummaryDataSets() { Logger.Instance.WriteMethodEntry(); //columns and order - //inboundSyncRuleName, inboundSyncRuleScopingConditionString, inboundExpression, inboundFlowType, inboundArrow, metaverseAttribute, metaverseObjectType, outboundArrow, outboundConnectorName, outboundSyncRuleName, outboundSyncRuleScopingConditionString, outboundObjectType, outboundExpression, outboundFlowType, targetAttribute + //inboundSyncRuleName, inboundSyncRuleGuid inboundSyncRuleScopingConditionString, inboundExpression, inboundFlowType, inboundPrecedence, inboundArrow, metaverseAttribute, metaverseObjectType, outboundArrow, outboundPrecedence, outboundConnectorName, outboundConnectorGuid, outboundSyncRuleName, outboundSyncRuleGuid outboundSyncRuleScopingConditionString, outboundObjectType, outboundFlowType, outboundExpression, targetAttribute try { var table = new DataTable("ExportSummary") { Locale = CultureInfo.InvariantCulture }; var column1 = new DataColumn("inboundSyncRuleName"); - var column2 = new DataColumn("inboundSyncRuleScopingConditionString"); - var column3 = new DataColumn("inboundExpression"); - var column4 = new DataColumn("inboundFlowType"); - var column5 = new DataColumn("inboundArrow"); - var column6 = new DataColumn("metaverseAttribute"); - var column7 = new DataColumn("metaverseObjectType"); - var column8 = new DataColumn("outboundArrow"); - var column9 = new DataColumn("outboundConnectorName"); - var column10 = new DataColumn("outboundSyncRuleName"); - var column11 = new DataColumn("outboundSyncRuleScopingConditionString"); - var column12 = new DataColumn("outboundObjectType"); - var column13 = new DataColumn("outboundExpression"); - var column14 = new DataColumn("outboundFlowType"); - var column15 = new DataColumn("targetAttribute"); + //required for bookmarks + var column2 = new DataColumn("inboundSyncRuleGuid"); + var column3 = new DataColumn("inboundSyncRuleScopingConditionString"); + var column4 = new DataColumn("inboundExpression"); + var column5 = new DataColumn("inboundFlowType"); + var column6 = new DataColumn("inboundPrecedence"); + var column7 = new DataColumn("inboundArrow"); + var column8 = new DataColumn("metaverseAttribute"); + var column9 = new DataColumn("metaverseObjectType"); + var column10 = new DataColumn("outboundArrow"); + var column11 = new DataColumn("outboundPrecedence"); + var column12 = new DataColumn("outboundConnectorName"); + //required for bookmarks + var column13 = new DataColumn("outboundConnectorGuid"); + var column14 = new DataColumn("outboundSyncRuleName"); + //required for bookmarks + var column15 = new DataColumn("outboundSyncRuleGuid"); + var column16 = new DataColumn("outboundSyncRuleScopingConditionString"); + var column17 = new DataColumn("outboundObjectType"); + var column18 = new DataColumn("outboundExpression"); + var column19 = new DataColumn("outboundFlowType"); + var column20 = new DataColumn("targetAttribute"); table.Columns.Add(column1); table.Columns.Add(column2); @@ -1757,7 +1797,12 @@ protected void CreateConnectorObjectExportAttributeFlowsSummaryDataSets() table.Columns.Add(column13); table.Columns.Add(column14); table.Columns.Add(column15); - table.PrimaryKey = new[] { column1, column2, column3, column4, column5, column6, column7, column8, column9, column10, column11, column12, column13, column14, column15 }; + table.Columns.Add(column16); + table.Columns.Add(column17); + table.Columns.Add(column18); + table.Columns.Add(column19); + table.Columns.Add(column20); + table.PrimaryKey = new[] { column1, column2, column3, column4, column5, column6, column7, column8, column9, column10, column11, column12, column13, column14, column15, column16, column17, column18, column19, column20 }; this.PilotDataSet = new DataSet("ExportAttributeFlowsSummary") { Locale = CultureInfo.InvariantCulture }; this.PilotDataSet.Tables.Add(table); @@ -1785,52 +1830,67 @@ protected DataTable GetConnectorObjectExportAttributeFlowsSummaryPrintTable() { var printTable = Documenter.GetPrintTable(); //columns and order - //inboundSyncRuleName, inboundSyncRuleScopingConditionString, inboundExpression, inboundFlowType, inboundArrow, metaverseAttribute, metaverseObjectType, outboundArrow, outboundConnectorName, outboundSyncRuleName, outboundSyncRuleScopingConditionString, outboundObjectType, outboundExpression, outboundFlowType,targetAttribute + //inboundSyncRuleName, inboundSyncRuleGuid, inboundSyncRuleScopingConditionString, inboundExpression, inboundFlowType, inboundPrecedence, inboundArrow, metaverseAttribute, metaverseObjectType, outboundArrow, outboundPrecedence, outboundConnectorName, outboundConnectorGuid, outboundSyncRuleName, outboundSyncRuleGuid, outboundSyncRuleScopingConditionString, outboundObjectType, outboundFlowType, outboundExpression, targetAttribute // Inbound Sync Rule Name - printTable.Rows.Add(new OrderedDictionary { { "TableIndex", 0 }, { "ColumnIndex", 0 }, { "Hidden", false }, { "SortOrder", -1 }, { "BookmarkIndex", -1 }, { "JumpToBookmarkIndex", 5 }, { "ChangeIgnored", false } }.Values.Cast().ToArray()); + printTable.Rows.Add(new OrderedDictionary { { "TableIndex", 0 }, { "ColumnIndex", 0 }, { "Hidden", false }, { "SortOrder", -1 }, { "BookmarkIndex", -1 }, { "JumpToBookmarkIndex", 1 }, { "ChangeIgnored", false } }.Values.Cast().ToArray()); + + // Inbound Sync Rule Guid - required for bookmarks + printTable.Rows.Add(new OrderedDictionary { { "TableIndex", 0 }, { "ColumnIndex", 1 }, { "Hidden", true }, { "SortOrder", -1 }, { "BookmarkIndex", -1 }, { "JumpToBookmarkIndex", -1 }, { "ChangeIgnored", false } }.Values.Cast().ToArray()); // Inbound Sync Rule Scoping Condition String - printTable.Rows.Add(new OrderedDictionary { { "TableIndex", 0 }, { "ColumnIndex", 1 }, { "Hidden", false }, { "SortOrder", -1 }, { "BookmarkIndex", -1 }, { "JumpToBookmarkIndex", -1 }, { "ChangeIgnored", false } }.Values.Cast().ToArray()); + printTable.Rows.Add(new OrderedDictionary { { "TableIndex", 0 }, { "ColumnIndex", 2 }, { "Hidden", false }, { "SortOrder", -1 }, { "BookmarkIndex", -1 }, { "JumpToBookmarkIndex", -1 }, { "ChangeIgnored", false } }.Values.Cast().ToArray()); // Inbound Expression - printTable.Rows.Add(new OrderedDictionary { { "TableIndex", 0 }, { "ColumnIndex", 2 }, { "Hidden", false }, { "SortOrder", -1 }, { "BookmarkIndex", -1 }, { "JumpToBookmarkIndex", -1 }, { "ChangeIgnored", false } }.Values.Cast().ToArray()); + printTable.Rows.Add(new OrderedDictionary { { "TableIndex", 0 }, { "ColumnIndex", 3 }, { "Hidden", false }, { "SortOrder", -1 }, { "BookmarkIndex", -1 }, { "JumpToBookmarkIndex", -1 }, { "ChangeIgnored", false } }.Values.Cast().ToArray()); // Inbound Flow Type - printTable.Rows.Add(new OrderedDictionary { { "TableIndex", 0 }, { "ColumnIndex", 3 }, { "Hidden", false }, { "SortOrder", -1 }, { "BookmarkIndex", -1 }, { "JumpToBookmarkIndex", -1 }, { "ChangeIgnored", true } }.Values.Cast().ToArray()); + printTable.Rows.Add(new OrderedDictionary { { "TableIndex", 0 }, { "ColumnIndex", 4 }, { "Hidden", false }, { "SortOrder", -1 }, { "BookmarkIndex", -1 }, { "JumpToBookmarkIndex", -1 }, { "ChangeIgnored", true } }.Values.Cast().ToArray()); + + // Inbound Precedence + printTable.Rows.Add(new OrderedDictionary { { "TableIndex", 0 }, { "ColumnIndex", 5 }, { "Hidden", false }, { "SortOrder", -1 }, { "BookmarkIndex", -1 }, { "JumpToBookmarkIndex", -1 }, { "ChangeIgnored", true } }.Values.Cast().ToArray()); // Inbound Arrow - printTable.Rows.Add(new OrderedDictionary { { "TableIndex", 0 }, { "ColumnIndex", 4 }, { "Hidden", false }, { "SortOrder", -1 }, { "BookmarkIndex", -1 }, { "JumpToBookmarkIndex", -1 }, { "ChangeIgnored", true } }.Values.Cast().ToArray()); + printTable.Rows.Add(new OrderedDictionary { { "TableIndex", 0 }, { "ColumnIndex", 6 }, { "Hidden", false }, { "SortOrder", -1 }, { "BookmarkIndex", -1 }, { "JumpToBookmarkIndex", -1 }, { "ChangeIgnored", true } }.Values.Cast().ToArray()); // Metaverse Attribute - printTable.Rows.Add(new OrderedDictionary { { "TableIndex", 0 }, { "ColumnIndex", 5 }, { "Hidden", false }, { "SortOrder", 0 }, { "BookmarkIndex", -1 }, { "JumpToBookmarkIndex", -1 }, { "ChangeIgnored", false } }.Values.Cast().ToArray()); + printTable.Rows.Add(new OrderedDictionary { { "TableIndex", 0 }, { "ColumnIndex", 7 }, { "Hidden", false }, { "SortOrder", 0 }, { "BookmarkIndex", -1 }, { "JumpToBookmarkIndex", -1 }, { "ChangeIgnored", false } }.Values.Cast().ToArray()); // Metaverse Object Type - printTable.Rows.Add(new OrderedDictionary { { "TableIndex", 0 }, { "ColumnIndex", 6 }, { "Hidden", false }, { "SortOrder", 0 }, { "BookmarkIndex", -1 }, { "JumpToBookmarkIndex", -1 }, { "ChangeIgnored", false } }.Values.Cast().ToArray()); + printTable.Rows.Add(new OrderedDictionary { { "TableIndex", 0 }, { "ColumnIndex", 8 }, { "Hidden", false }, { "SortOrder", 0 }, { "BookmarkIndex", -1 }, { "JumpToBookmarkIndex", -1 }, { "ChangeIgnored", false } }.Values.Cast().ToArray()); // Outbound Arrow - printTable.Rows.Add(new OrderedDictionary { { "TableIndex", 0 }, { "ColumnIndex", 7 }, { "Hidden", false }, { "SortOrder", -1 }, { "BookmarkIndex", -1 }, { "JumpToBookmarkIndex", -1 }, { "ChangeIgnored", true } }.Values.Cast().ToArray()); + printTable.Rows.Add(new OrderedDictionary { { "TableIndex", 0 }, { "ColumnIndex", 9 }, { "Hidden", false }, { "SortOrder", -1 }, { "BookmarkIndex", -1 }, { "JumpToBookmarkIndex", -1 }, { "ChangeIgnored", true } }.Values.Cast().ToArray()); + + // Outbound Precedence + printTable.Rows.Add(new OrderedDictionary { { "TableIndex", 0 }, { "ColumnIndex", 10 }, { "Hidden", false }, { "SortOrder", -1 }, { "BookmarkIndex", -1 }, { "JumpToBookmarkIndex", -1 }, { "ChangeIgnored", false } }.Values.Cast().ToArray()); // Outbound Connector Name - printTable.Rows.Add(new OrderedDictionary { { "TableIndex", 0 }, { "ColumnIndex", 8 }, { "Hidden", false }, { "SortOrder", -1 }, { "BookmarkIndex", -1 }, { "JumpToBookmarkIndex", 8 }, { "ChangeIgnored", false } }.Values.Cast().ToArray()); + printTable.Rows.Add(new OrderedDictionary { { "TableIndex", 0 }, { "ColumnIndex", 11 }, { "Hidden", false }, { "SortOrder", -1 }, { "BookmarkIndex", -1 }, { "JumpToBookmarkIndex", 12 }, { "ChangeIgnored", false } }.Values.Cast().ToArray()); + + // Outbound Connector Guid - required for bookmarks + printTable.Rows.Add(new OrderedDictionary { { "TableIndex", 0 }, { "ColumnIndex", 12 }, { "Hidden", true }, { "SortOrder", -1 }, { "BookmarkIndex", -1 }, { "JumpToBookmarkIndex", -1 }, { "ChangeIgnored", false } }.Values.Cast().ToArray()); // Outbound Sync Rule Name - printTable.Rows.Add(new OrderedDictionary { { "TableIndex", 0 }, { "ColumnIndex", 9 }, { "Hidden", false }, { "SortOrder", -1 }, { "BookmarkIndex", -1 }, { "JumpToBookmarkIndex", 9 }, { "ChangeIgnored", false } }.Values.Cast().ToArray()); + printTable.Rows.Add(new OrderedDictionary { { "TableIndex", 0 }, { "ColumnIndex", 13 }, { "Hidden", false }, { "SortOrder", -1 }, { "BookmarkIndex", -1 }, { "JumpToBookmarkIndex", 14 }, { "ChangeIgnored", false } }.Values.Cast().ToArray()); + + // Outbound Sync Rule Guid - required for bookmarks + printTable.Rows.Add(new OrderedDictionary { { "TableIndex", 0 }, { "ColumnIndex", 14 }, { "Hidden", true }, { "SortOrder", -1 }, { "BookmarkIndex", -1 }, { "JumpToBookmarkIndex", -1 }, { "ChangeIgnored", false } }.Values.Cast().ToArray()); // Outbound Sync Rule Scoping Condition String - printTable.Rows.Add(new OrderedDictionary { { "TableIndex", 0 }, { "ColumnIndex", 10 }, { "Hidden", false }, { "SortOrder", -1 }, { "BookmarkIndex", -1 }, { "JumpToBookmarkIndex", -1 }, { "ChangeIgnored", false } }.Values.Cast().ToArray()); + printTable.Rows.Add(new OrderedDictionary { { "TableIndex", 0 }, { "ColumnIndex", 15 }, { "Hidden", false }, { "SortOrder", -1 }, { "BookmarkIndex", -1 }, { "JumpToBookmarkIndex", -1 }, { "ChangeIgnored", false } }.Values.Cast().ToArray()); // Outbound Object Type - printTable.Rows.Add(new OrderedDictionary { { "TableIndex", 0 }, { "ColumnIndex", 11 }, { "Hidden", false }, { "SortOrder", -1 }, { "BookmarkIndex", -1 }, { "JumpToBookmarkIndex", -1 }, { "ChangeIgnored", false } }.Values.Cast().ToArray()); + printTable.Rows.Add(new OrderedDictionary { { "TableIndex", 0 }, { "ColumnIndex", 16 }, { "Hidden", false }, { "SortOrder", -1 }, { "BookmarkIndex", -1 }, { "JumpToBookmarkIndex", -1 }, { "ChangeIgnored", false } }.Values.Cast().ToArray()); // Outbound Expression - printTable.Rows.Add(new OrderedDictionary { { "TableIndex", 0 }, { "ColumnIndex", 12 }, { "Hidden", false }, { "SortOrder", -1 }, { "BookmarkIndex", -1 }, { "JumpToBookmarkIndex", -1 }, { "ChangeIgnored", false } }.Values.Cast().ToArray()); + printTable.Rows.Add(new OrderedDictionary { { "TableIndex", 0 }, { "ColumnIndex", 17 }, { "Hidden", false }, { "SortOrder", -1 }, { "BookmarkIndex", -1 }, { "JumpToBookmarkIndex", -1 }, { "ChangeIgnored", false } }.Values.Cast().ToArray()); // Outbound Flow Type - printTable.Rows.Add(new OrderedDictionary { { "TableIndex", 0 }, { "ColumnIndex", 13 }, { "Hidden", false }, { "SortOrder", -1 }, { "BookmarkIndex", -1 }, { "JumpToBookmarkIndex", -1 }, { "ChangeIgnored", true } }.Values.Cast().ToArray()); + printTable.Rows.Add(new OrderedDictionary { { "TableIndex", 0 }, { "ColumnIndex", 18 }, { "Hidden", false }, { "SortOrder", -1 }, { "BookmarkIndex", -1 }, { "JumpToBookmarkIndex", -1 }, { "ChangeIgnored", true } }.Values.Cast().ToArray()); // Target Attribute - printTable.Rows.Add(new OrderedDictionary { { "TableIndex", 0 }, { "ColumnIndex", 14 }, { "Hidden", false }, { "SortOrder", -1 }, { "BookmarkIndex", -1 }, { "JumpToBookmarkIndex", -1 }, { "ChangeIgnored", false } }.Values.Cast().ToArray()); + printTable.Rows.Add(new OrderedDictionary { { "TableIndex", 0 }, { "ColumnIndex", 19 }, { "Hidden", false }, { "SortOrder", -1 }, { "BookmarkIndex", -1 }, { "JumpToBookmarkIndex", -1 }, { "ChangeIgnored", false } }.Values.Cast().ToArray()); printTable.AcceptChanges(); @@ -1850,7 +1910,7 @@ protected void FillConnectorObjectExportAttributeFlowsSummary(bool pilotConfig) { Logger.Instance.WriteMethodEntry("Pilot Config: '{0}'.", pilotConfig); //columns and order - //inboundSyncRuleName, inboundSyncRuleScopingConditionString, inboundExpression, inboundFlowType, inboundArrow, metaverseAttribute, metaverseObjectType, outboundArrow, outboundConnectorName, outboundSyncRuleName, outboundSyncRuleScopingConditionString, outboundObjectType, outboundExpression, outboundFlowType, targetAttribute + //inboundSyncRuleName, inboundSyncRuleGuid, inboundSyncRuleScopingConditionString, inboundExpression, inboundFlowType, inboundPrecedence, inboundArrow, metaverseAttribute, metaverseObjectType, outboundArrow, outboundPrecedence, outboundConnectorName, outboundConnectorGuid, outboundSyncRuleName, outboundSyncRuleGuid, outboundSyncRuleScopingConditionString, outboundObjectType, outboundFlowType, outboundExpression, targetAttribute try { @@ -1869,11 +1929,8 @@ protected void FillConnectorObjectExportAttributeFlowsSummary(bool pilotConfig) let dest = (string)outboundSyncRuleDestination orderby dest select dest; - //foreach (var metaverseAttribute in metaverseAttributes.Distinct()) foreach (var metaverseAttribute in metaverseAttributes.Distinct()) { - //Documenter.AddRow(table, new object[] { metaverseAttribute, "←" }); - // Outbound metaverse flows var outboundSyncRules = config.XPathSelectElements(Documenter.GetSynchronizationRuleXmlRootXPath(pilotConfig) + "/synchronizationRule[direction = 'Outbound' " + Documenter.SyncRuleDisabledCondition + " and targetObjectType = '" + this.currentDataSourceObjectType + "' and (attribute-mappings/mapping/src/attr = '" + metaverseAttribute + "' or contains(attribute-mappings/mapping/expression, '[" + metaverseAttribute + "]'))]"); outboundSyncRules = from syncRule in outboundSyncRules @@ -1932,26 +1989,25 @@ orderby inboundSyncRulePrecedence string inboundExpression = ""; string inboundSyncRuleScopingConditionString = ""; string inboundFlowType = ""; + string inboundPrecedence = ""; if (inboundSyncRules.ElementAtOrDefault(i) != null) { inboundSyncRuleName = (string)inboundSyncRules.ElementAt(i).Element("name"); inboundSyncRuleGuid = (string)inboundSyncRules.ElementAt(i).Element("id"); metaverseObjectType = (string)inboundSyncRules.ElementAt(i).Element("targetObjectType"); + inboundPrecedence = (string)inboundSyncRules.ElementAt(i).Element("precedence"); ++inboundSyncRuleRank; if (inboundSyncRules.ElementAt(i).XPathSelectElements("./attribute-mappings/mapping[dest = '" + metaverseAttribute + "']").Count() > 1) { string s = ""; } var transformation = inboundSyncRules.ElementAt(i).XPathSelectElement("./attribute-mappings/mapping[dest = '" + metaverseAttribute + "']"); - //Expression expression = (string)transformation.Element("expression"); - //Direct srcAttribute = (string)transformation.XPathSelectElement("src/attr"); - //Constant var src = (string)transformation.XPathSelectElement("src"); inboundExpression = !string.IsNullOrEmpty(expression) ? expression : !string.IsNullOrEmpty(srcAttribute) ? srcAttribute : src; - inboundFlowType = !string.IsNullOrEmpty(expression) ? "Expression" : !string.IsNullOrEmpty(srcAttribute) ? "Direct" : "Constant"; + inboundFlowType = !string.IsNullOrEmpty(expression) ? "Expression" : "Direct"; var inboundSyncRuleScopingConditions = inboundSyncRules.ElementAt(i).XPathSelectElements("./synchronizationCriteria/conditions"); var inboundSyncRuleScopingConditionsCount = inboundSyncRuleScopingConditions.Count(); @@ -1982,6 +2038,7 @@ orderby inboundSyncRulePrecedence string outboundSyncRuleScopingCondition = ""; string outboundObjectType = ""; string outboundFlowType = ""; + string outboundPrecedence = ""; if (outboundSyncRules.ElementAtOrDefault(i) != null) { @@ -1990,6 +2047,7 @@ orderby inboundSyncRulePrecedence metaverseObjectType = (string)outboundSyncRules.ElementAt(i).Element("sourceObjectType"); outboundConnectorGuid = ((string)outboundSyncRules.ElementAt(i).Element("connector") ?? string.Empty).ToUpperInvariant(); outboundObjectType = (string)outboundSyncRules.ElementAt(i).Element("targetObjectType"); + outboundPrecedence = (string)outboundSyncRules.ElementAt(i).Element("precedence"); outboundConnectorName = (string)config.XPathSelectElement(Documenter.GetConnectorXmlRootXPath(pilotConfig) + "/ma-data[translate(id, '" + Documenter.LowercaseLetters + "', '" + Documenter.UppercaseLetters + "') = '" + outboundConnectorGuid + "']/name"); if (string.IsNullOrEmpty(outboundConnectorName)) { @@ -2031,8 +2089,8 @@ orderby inboundSyncRulePrecedence } } //columns and order - //inboundSyncRuleName, inboundSyncRuleScopingConditionString, inboundExpression, inboundFlowType, inboundArrow, metaverseAttribute, metaverseObjectType, outboundArrow, outboundConnectorName, outboundSyncRuleName, outboundSyncRuleScopingConditionString, outboundObjectType, outboundExpression, outboundFlowType, targetAttribute - Documenter.AddRow(table, new object[] { inboundSyncRuleName, inboundSyncRuleScopingConditionString, inboundExpression, inboundFlowType, "→", metaverseAttribute, metaverseObjectType, "→", outboundConnectorName, outboundSyncRuleName, outboundSyncRuleScopingCondition, outboundObjectType, outboundExpression, outboundFlowType, targetAttribute }); + //inboundSyncRuleName, inboundSyncRuleGuid, inboundSyncRuleScopingConditionString, inboundExpression, inboundFlowType, inboundPrecedence, inboundArrow, metaverseAttribute, metaverseObjectType, outboundArrow, outboundPrecedence, outboundConnectorName, outboundConnectorGuid, outboundSyncRuleName, outboundSyncRuleGuid, outboundSyncRuleScopingConditionString, outboundObjectType, outboundFlowType, outboundExpression, targetAttribute + Documenter.AddRow(table, new object[] { inboundSyncRuleName, inboundSyncRuleGuid, inboundSyncRuleScopingConditionString, inboundExpression, inboundFlowType, inboundPrecedence, "→", metaverseAttribute, metaverseObjectType, "→", outboundPrecedence, outboundConnectorName, outboundConnectorGuid, outboundSyncRuleName, outboundSyncRuleGuid, outboundSyncRuleScopingCondition, outboundObjectType, outboundExpression, outboundFlowType, targetAttribute }); } } } @@ -2077,64 +2135,71 @@ protected DataTable GetConnectorObjectExportAttributeFlowsSummaryHeaderTable() { var headerTable = Documenter.GetHeaderTable(); - //columns and order - //inboundSyncRuleName, inboundSyncRuleScopingConditionString, inboundExpression, inboundFlowType, inboundArrow, metaverseAttribute, metaverseObjectType, outboundArrow, outboundConnectorName, outboundSyncRuleName, outboundSyncRuleScopingConditionString, outboundObjectType, outboundFlowType, outboundExpression, targetAttribute - + //columns and order - doesn't include hidden GUID columns + //inboundSyncRuleName, inboundSyncRuleScopingConditionString, inboundExpression, inboundFlowType, inboundPrecedence, inboundArrow, metaverseAttribute, metaverseObjectType, outboundArrow, outboundPrecedence, outboundConnectorName, outboundSyncRuleName, outboundSyncRuleScopingConditionString, outboundObjectType, outboundFlowType, outboundExpression, targetAttribute + //colWidths + //10 + 1 + 10 + 6 + 5 + 2 + 8 + 5 + 2 + 5 + 10 + 10 + 1 + 5 + 6 + 10 + 7 // Header Row 1 // Import Flows - headerTable.Rows.Add(new OrderedDictionary { { "RowIndex", 0 }, { "ColumnIndex", 0 }, { "ColumnName", "Import Flows" }, { "RowSpan", 1 }, { "ColSpan", 5 }, { "ColWidth", 0 } }.Values.Cast().ToArray()); + headerTable.Rows.Add(new OrderedDictionary { { "RowIndex", 0 }, { "ColumnIndex", 0 }, { "ColumnName", "Import Flows" }, { "RowSpan", 1 }, { "ColSpan", 6 }, { "ColWidth", 0 } }.Values.Cast().ToArray()); // MV Attribute headerTable.Rows.Add(new OrderedDictionary { { "RowIndex", 0 }, { "ColumnIndex", 1 }, { "ColumnName", "Metaverse" }, { "RowSpan", 1 }, { "ColSpan", 3 }, { "ColWidth", 0 } }.Values.Cast().ToArray()); // Export Flows - headerTable.Rows.Add(new OrderedDictionary { { "RowIndex", 0 }, { "ColumnIndex", 2 }, { "ColumnName", "Export Flows" }, { "RowSpan", 1 }, { "ColSpan", 7 }, { "ColWidth", 0 } }.Values.Cast().ToArray()); + headerTable.Rows.Add(new OrderedDictionary { { "RowIndex", 0 }, { "ColumnIndex", 2 }, { "ColumnName", "Export Flows" }, { "RowSpan", 1 }, { "ColSpan", 9 }, { "ColWidth", 0 } }.Values.Cast().ToArray()); // Header Row 2 // Inbound Sync Rule Name - headerTable.Rows.Add(new OrderedDictionary { { "RowIndex", 1 }, { "ColumnIndex", 0 }, { "ColumnName", "Inbound Sync Rule" }, { "RowSpan", 1 }, { "ColSpan", 1 }, { "ColWidth", 10 } }.Values.Cast().ToArray()); + headerTable.Rows.Add(new OrderedDictionary { { "RowIndex", 1 }, { "ColumnIndex", 0 }, { "ColumnName", "Sync Rule" }, { "RowSpan", 1 }, { "ColSpan", 1 }, { "ColWidth", 10 } }.Values.Cast().ToArray()); // Inbound Sync Rule Scoping Condition String - headerTable.Rows.Add(new OrderedDictionary { { "RowIndex", 1 }, { "ColumnIndex", 1 }, { "ColumnName", "Inbound Sync Rule Scoping Condition" }, { "RowSpan", 1 }, { "ColSpan", 1 }, { "ColWidth", 10 } }.Values.Cast().ToArray()); + headerTable.Rows.Add(new OrderedDictionary { { "RowIndex", 1 }, { "ColumnIndex", 1 }, { "ColumnName", "Sync Rule Scoping Condition" }, { "RowSpan", 1 }, { "ColSpan", 1 }, { "ColWidth", 10 } }.Values.Cast().ToArray()); // Inbound Expression - headerTable.Rows.Add(new OrderedDictionary { { "RowIndex", 1 }, { "ColumnIndex", 2 }, { "ColumnName", "Inbound Expression" }, { "RowSpan", 1 }, { "ColSpan", 1 }, { "ColWidth", 10 } }.Values.Cast().ToArray()); + headerTable.Rows.Add(new OrderedDictionary { { "RowIndex", 1 }, { "ColumnIndex", 2 }, { "ColumnName", "Expression" }, { "RowSpan", 1 }, { "ColSpan", 1 }, { "ColWidth", 10 } }.Values.Cast().ToArray()); // Inbound Flow Type - headerTable.Rows.Add(new OrderedDictionary { { "RowIndex", 1 }, { "ColumnIndex", 3 }, { "ColumnName", "Inbound Flow Type" }, { "RowSpan", 1 }, { "ColSpan", 1 }, { "ColWidth", 10 } }.Values.Cast().ToArray()); + headerTable.Rows.Add(new OrderedDictionary { { "RowIndex", 1 }, { "ColumnIndex", 3 }, { "ColumnName", "Flow Type" }, { "RowSpan", 1 }, { "ColSpan", 1 }, { "ColWidth", 6 } }.Values.Cast().ToArray()); + + // Inbound Precedence + headerTable.Rows.Add(new OrderedDictionary { { "RowIndex", 1 }, { "ColumnIndex", 4 }, { "ColumnName", "Rank" }, { "RowSpan", 1 }, { "ColSpan", 1 }, { "ColWidth", 5 } }.Values.Cast().ToArray()); // Inbound Arrow - headerTable.Rows.Add(new OrderedDictionary { { "RowIndex", 1 }, { "ColumnIndex", 4 }, { "ColumnName", "→" }, { "RowSpan", 1 }, { "ColSpan", 1 }, { "ColWidth", 2 } }.Values.Cast().ToArray()); + headerTable.Rows.Add(new OrderedDictionary { { "RowIndex", 1 }, { "ColumnIndex", 5 }, { "ColumnName", "→" }, { "RowSpan", 1 }, { "ColSpan", 1 }, { "ColWidth", 2 } }.Values.Cast().ToArray()); // Metaverse attribute - headerTable.Rows.Add(new OrderedDictionary { { "RowIndex", 1 }, { "ColumnIndex", 5 }, { "ColumnName", "Metaverse Attribute" }, { "RowSpan", 1 }, { "ColSpan", 1 }, { "ColWidth", 8 } }.Values.Cast().ToArray()); + headerTable.Rows.Add(new OrderedDictionary { { "RowIndex", 1 }, { "ColumnIndex", 6 }, { "ColumnName", "MV Attribute" }, { "RowSpan", 1 }, { "ColSpan", 1 }, { "ColWidth", 8 } }.Values.Cast().ToArray()); // Metaverse Object Type - headerTable.Rows.Add(new OrderedDictionary { { "RowIndex", 1 }, { "ColumnIndex", 6 }, { "ColumnName", "Metaverse Object Type" }, { "RowSpan", 1 }, { "ColSpan", 1 }, { "ColWidth", 8 } }.Values.Cast().ToArray()); + headerTable.Rows.Add(new OrderedDictionary { { "RowIndex", 1 }, { "ColumnIndex", 7 }, { "ColumnName", "MV Object Type" }, { "RowSpan", 1 }, { "ColSpan", 1 }, { "ColWidth", 5 } }.Values.Cast().ToArray()); // Outbound Arrow - headerTable.Rows.Add(new OrderedDictionary { { "RowIndex", 1 }, { "ColumnIndex", 7 }, { "ColumnName", "→" }, { "RowSpan", 1 }, { "ColSpan", 1 }, { "ColWidth", 2 } }.Values.Cast().ToArray()); + headerTable.Rows.Add(new OrderedDictionary { { "RowIndex", 1 }, { "ColumnIndex", 8 }, { "ColumnName", "→" }, { "RowSpan", 1 }, { "ColSpan", 1 }, { "ColWidth", 2 } }.Values.Cast().ToArray()); + + // Outbound Precedence + headerTable.Rows.Add(new OrderedDictionary { { "RowIndex", 1 }, { "ColumnIndex", 9 }, { "ColumnName", "Rank" }, { "RowSpan", 1 }, { "ColSpan", 1 }, { "ColWidth", 5 } }.Values.Cast().ToArray()); // Outbound Connector Name - headerTable.Rows.Add(new OrderedDictionary { { "RowIndex", 1 }, { "ColumnIndex", 8 }, { "ColumnName", "Outbound Connector" }, { "RowSpan", 1 }, { "ColSpan", 1 }, { "ColWidth", 10 } }.Values.Cast().ToArray()); + headerTable.Rows.Add(new OrderedDictionary { { "RowIndex", 1 }, { "ColumnIndex", 10 }, { "ColumnName", "Connector" }, { "RowSpan", 1 }, { "ColSpan", 1 }, { "ColWidth", 10 } }.Values.Cast().ToArray()); // Outbound Sync Rule Name - headerTable.Rows.Add(new OrderedDictionary { { "RowIndex", 1 }, { "ColumnIndex", 9 }, { "ColumnName", "Outbound Sync Rule" }, { "RowSpan", 1 }, { "ColSpan", 1 }, { "ColWidth", 10 } }.Values.Cast().ToArray()); + headerTable.Rows.Add(new OrderedDictionary { { "RowIndex", 1 }, { "ColumnIndex", 11 }, { "ColumnName", "Sync Rule" }, { "RowSpan", 1 }, { "ColSpan", 1 }, { "ColWidth", 10 } }.Values.Cast().ToArray()); // Outbound Sync Rule Scoping Condition String - headerTable.Rows.Add(new OrderedDictionary { { "RowIndex", 1 }, { "ColumnIndex", 10 }, { "ColumnName", "Outbound Sync Rule Scoping Condition" }, { "RowSpan", 1 }, { "ColSpan", 1 }, { "ColWidth", 10 } }.Values.Cast().ToArray()); + headerTable.Rows.Add(new OrderedDictionary { { "RowIndex", 1 }, { "ColumnIndex", 12 }, { "ColumnName", "Sync Rule Scoping Condition" }, { "RowSpan", 1 }, { "ColSpan", 1 }, { "ColWidth", 10 } }.Values.Cast().ToArray()); // Outbound Object Type - headerTable.Rows.Add(new OrderedDictionary { { "RowIndex", 1 }, { "ColumnIndex", 11 }, { "ColumnName", "Outbound Object Type" }, { "RowSpan", 1 }, { "ColSpan", 1 }, { "ColWidth", 10 } }.Values.Cast().ToArray()); + headerTable.Rows.Add(new OrderedDictionary { { "RowIndex", 1 }, { "ColumnIndex", 13 }, { "ColumnName", "Object Type" }, { "RowSpan", 1 }, { "ColSpan", 1 }, { "ColWidth", 5 } }.Values.Cast().ToArray()); // Outbound Flow Type - headerTable.Rows.Add(new OrderedDictionary { { "RowIndex", 1 }, { "ColumnIndex", 12 }, { "ColumnName", "Outbound Flow Type" }, { "RowSpan", 1 }, { "ColSpan", 1 }, { "ColWidth", 10 } }.Values.Cast().ToArray()); + headerTable.Rows.Add(new OrderedDictionary { { "RowIndex", 1 }, { "ColumnIndex", 14 }, { "ColumnName", "Flow Type" }, { "RowSpan", 1 }, { "ColSpan", 1 }, { "ColWidth", 6 } }.Values.Cast().ToArray()); // Outbound Expression - headerTable.Rows.Add(new OrderedDictionary { { "RowIndex", 1 }, { "ColumnIndex", 13 }, { "ColumnName", "Outbound Expression" }, { "RowSpan", 1 }, { "ColSpan", 1 }, { "ColWidth", 10 } }.Values.Cast().ToArray()); + headerTable.Rows.Add(new OrderedDictionary { { "RowIndex", 1 }, { "ColumnIndex", 15 }, { "ColumnName", "Expression" }, { "RowSpan", 1 }, { "ColSpan", 1 }, { "ColWidth", 10 } }.Values.Cast().ToArray()); // Target Attribute - headerTable.Rows.Add(new OrderedDictionary { { "RowIndex", 1 }, { "ColumnIndex", 14 }, { "ColumnName", "Target Attribute" }, { "RowSpan", 1 }, { "ColSpan", 1 }, { "ColWidth", 10 } }.Values.Cast().ToArray()); + headerTable.Rows.Add(new OrderedDictionary { { "RowIndex", 1 }, { "ColumnIndex", 16 }, { "ColumnName", "Target Attribute" }, { "RowSpan", 1 }, { "ColSpan", 1 }, { "ColWidth", 7 } }.Values.Cast().ToArray()); headerTable.AcceptChanges(); From b6595d52695c108a68e9ceedee57fa93de86585c Mon Sep 17 00:00:00 2001 From: FIMTooler Date: Fri, 26 Apr 2024 16:34:32 -0400 Subject: [PATCH 09/10] Update FlowType to include Constant --- .../ConnectorDocumenter.cs | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/src/AzureADConnectSyncDocumenter/ConnectorDocumenter.cs b/src/AzureADConnectSyncDocumenter/ConnectorDocumenter.cs index 43b9cbb..c9002b7 100644 --- a/src/AzureADConnectSyncDocumenter/ConnectorDocumenter.cs +++ b/src/AzureADConnectSyncDocumenter/ConnectorDocumenter.cs @@ -1488,11 +1488,14 @@ orderby outboundSyncRulePrecedence ++inboundSyncRuleRank; var transformation = inboundSyncRules.ElementAt(i).XPathSelectElement("./attribute-mappings/mapping[dest = '" + metaverseAttribute + "']"); + //Expression expression = (string)transformation.Element("expression"); + //Direct srcAttribute = (string)transformation.XPathSelectElement("src/attr"); + //Constant var src = (string)transformation.XPathSelectElement("src"); inboundExpression = !string.IsNullOrEmpty(expression) ? expression : !string.IsNullOrEmpty(srcAttribute) ? srcAttribute : src; - inboundFlowType = !string.IsNullOrEmpty(expression) ? "Expression" : "Direct"; + inboundFlowType = !string.IsNullOrEmpty(expression) ? "Expression" : !string.IsNullOrEmpty(srcAttribute) ? "Direct" : "Constant"; var inboundSyncRuleScopingConditions = inboundSyncRules.ElementAt(i).XPathSelectElements("./synchronizationCriteria/conditions"); var inboundSyncRuleScopingConditionsCount = inboundSyncRuleScopingConditions.Count(); @@ -2003,11 +2006,14 @@ orderby inboundSyncRulePrecedence string s = ""; } var transformation = inboundSyncRules.ElementAt(i).XPathSelectElement("./attribute-mappings/mapping[dest = '" + metaverseAttribute + "']"); + //Expression expression = (string)transformation.Element("expression"); + //Direct srcAttribute = (string)transformation.XPathSelectElement("src/attr"); + //Constant var src = (string)transformation.XPathSelectElement("src"); inboundExpression = !string.IsNullOrEmpty(expression) ? expression : !string.IsNullOrEmpty(srcAttribute) ? srcAttribute : src; - inboundFlowType = !string.IsNullOrEmpty(expression) ? "Expression" : "Direct"; + inboundFlowType = !string.IsNullOrEmpty(expression) ? "Expression" : !string.IsNullOrEmpty(srcAttribute) ? "Direct" : "Constant"; var inboundSyncRuleScopingConditions = inboundSyncRules.ElementAt(i).XPathSelectElements("./synchronizationCriteria/conditions"); var inboundSyncRuleScopingConditionsCount = inboundSyncRuleScopingConditions.Count(); From 42d7edd183605679830f369bfef695fdc8575bf7 Mon Sep 17 00:00:00 2001 From: FIMTooler Date: Fri, 26 Apr 2024 17:01:20 -0400 Subject: [PATCH 10/10] Update FlowType to include Constant in End to End Flows --- src/AzureADConnectSyncDocumenter/MetaverseDocumenter.cs | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/AzureADConnectSyncDocumenter/MetaverseDocumenter.cs b/src/AzureADConnectSyncDocumenter/MetaverseDocumenter.cs index 31d3166..77e3800 100644 --- a/src/AzureADConnectSyncDocumenter/MetaverseDocumenter.cs +++ b/src/AzureADConnectSyncDocumenter/MetaverseDocumenter.cs @@ -370,11 +370,14 @@ orderby precedence Logger.Instance.WriteVerbose("Processing Sync Rule Info for Connector: '{0}'. Sync Rule: '{1}'.", connectorName, inboundSyncRuleName); + //Expression var mappingExpression = (string)syncRule.XPathSelectElement("attribute-mappings/mapping[dest = '" + metaverseAttribute + "']/expression"); + //Direct var mappingSourceAttribute = (string)syncRule.XPathSelectElement("attribute-mappings/mapping[dest = '" + metaverseAttribute + "']/src/attr"); + //Constant var mappingSource = (string)syncRule.XPathSelectElement("attribute-mappings/mapping[dest = '" + metaverseAttribute + "']/src"); string inboundExpression = (string)mappingExpression ?? (string)mappingSourceAttribute ?? (string)mappingSource ?? "??"; - string inboundFlowType = !string.IsNullOrEmpty(mappingExpression) ? "Expression" : "Direct"; + string inboundFlowType = !string.IsNullOrEmpty(mappingExpression) ? "Expression" : !string.IsNullOrEmpty(mappingSourceAttribute) ? "Direct" : "Constant"; Logger.Instance.WriteVerbose("Processed Sync Rule Info for Connector: '{0}'. Sync Rule: '{1}'.", connectorName, inboundSyncRuleName);