protected void FillConnectorObjectTypeExportAttributeFlowsDataSet()

in src/MIMConfigDocumenter/ConnectorDocumenter.cs [2014:2119]


        protected void FillConnectorObjectTypeExportAttributeFlowsDataSet(bool pilotConfig)
        {
            Logger.Instance.WriteMethodEntry("Pilot Config: '{0}'.", pilotConfig);

            try
            {
                var config = pilotConfig ? this.PilotXml : this.ProductionXml;
                var dataSet = pilotConfig ? this.PilotDataSet : this.ProductionDataSet;

                var table = dataSet.Tables[0];

                var connector = config.XPathSelectElement(Documenter.GetConnectorXmlRootXPath(pilotConfig) + "/ma-data[name ='" + this.ConnectorName + "']");

                if (connector != null)
                {
                    var exportFlowsXPath = "export-attribute-flow/export-flow-set[@mv-object-type = '" + this.currentMetaverseObjectType + "' and @cd-object-type = '" + this.currentDataSourceObjectType + "']/export-flow";
                    var exportFlows = from exportFlow in connector.XPathSelectElements(exportFlowsXPath)
                                      let dataSourceAttribute = (string)exportFlow.Attribute("cd-attribute")
                                      orderby dataSourceAttribute
                                      select exportFlow;

                    if (exportFlows.Count() == 0)
                    {
                        return;
                    }

                    var exportFlowRuleIndex = 0; // This will be the relative rule number if there are more than one outbound sync rule export flows for the same data source attribute.
                    var previousDataSourceAttribute = string.Empty;
                    var exportFlowIndex = 0;
                    foreach (var exportFlow in exportFlows)
                    {
                        ++exportFlowIndex;

                        var dataSourceAttribute = (string)exportFlow.Attribute("cd-attribute");

                        exportFlowRuleIndex = dataSourceAttribute == previousDataSourceAttribute ? exportFlowRuleIndex + 1 : 0;
                        previousDataSourceAttribute = dataSourceAttribute;

                        var metaverseAttribute = string.Empty;
                        var mappingType = string.Empty;
                        var allowNull = !((string)exportFlow.Attribute("suppress-deletions") ?? string.Empty).Equals("true", StringComparison.OrdinalIgnoreCase) ? "Yes" : string.Empty;
                        var initialFlowOnly = string.Empty;

                        if (exportFlow.XPathSelectElement("direct-mapping/src-attribute") != null)
                        {
                            metaverseAttribute = exportFlow.XPathSelectElement("direct-mapping/src-attribute").Value;
                            mappingType = "Direct";
                        }
                        else if (exportFlow.XPathSelectElement("scripted-mapping/src-attribute") != null)
                        {
                            foreach (var sourceAttribute in exportFlow.XPathSelectElements("scripted-mapping/src-attribute"))
                            {
                                metaverseAttribute += (string)sourceAttribute + "<br/>";
                            }

                            metaverseAttribute = !string.IsNullOrEmpty(metaverseAttribute) ? metaverseAttribute.Substring(0, metaverseAttribute.Length - "<br/>".Length) : metaverseAttribute;
                            mappingType = "Rules Extension - " + exportFlow.XPathSelectElement("scripted-mapping/script-context").Value;
                        }
                        else if (exportFlow.XPathSelectElement("constant-mapping/constant-value") != null)
                        {
                            metaverseAttribute = string.Empty;
                            mappingType = "Constant - " + exportFlow.XPathSelectElement("constant-mapping/constant-value").Value;
                        }
                        else if (exportFlow.XPathSelectElement("dn-part-mapping/dn-part") != null)
                        {
                            metaverseAttribute = string.Empty;
                            mappingType = "DN Component - ( " + exportFlow.XPathSelectElement("dn-part-mapping/dn-part").Value + " )";
                        }
                        else if (exportFlow.XPathSelectElement("sync-rule-mapping") != null)
                        {
                            mappingType = (string)exportFlow.XPathSelectElement("sync-rule-mapping").Attribute("mapping-type") ?? string.Empty;
                            if (mappingType.Equals("direct", StringComparison.OrdinalIgnoreCase))
                            {
                                metaverseAttribute = exportFlow.XPathSelectElement("sync-rule-mapping/src-attribute").Value;
                                mappingType = "Sync Rule - Direct";
                            }
                            else if (mappingType.Equals("constant", StringComparison.OrdinalIgnoreCase))
                            {
                                metaverseAttribute = exportFlow.XPathSelectElement("sync-rule-mapping/sync-rule-value").Value;
                                mappingType = "Sync Rule - Constant";
                            }
                            else
                            {
                                foreach (var sourceAttribute in exportFlow.XPathSelectElements("sync-rule-mapping/src-attribute"))
                                {
                                    metaverseAttribute += (string)sourceAttribute + "<br/>";
                                }

                                metaverseAttribute = !string.IsNullOrEmpty(metaverseAttribute) ? metaverseAttribute.Substring(0, metaverseAttribute.Length - "<br/>".Length) : metaverseAttribute;
                                mappingType = "Sync Rule - Expression";  // TODO: Print the Sync Rule Expression
                            }

                            initialFlowOnly = ((string)exportFlow.XPathSelectElement("sync-rule-mapping").Attribute("initial-flow-only") ?? string.Empty).Equals("true", StringComparison.OrdinalIgnoreCase) ? "Yes" : string.Empty;
                        }

                        Documenter.AddRow(table, new object[] { dataSourceAttribute + exportFlowRuleIndex, dataSourceAttribute, "&#8592;", metaverseAttribute, mappingType, allowNull, initialFlowOnly });
                    }

                    table.AcceptChanges();
                }
            }
            finally
            {
                Logger.Instance.WriteMethodExit("Pilot Config: '{0}'.", pilotConfig);
            }
        }