public static object ProcessParameterDeserializer(string[] parameterSpec)
        {
            string paramKey = parameterSpec[0], paramValue = parameterSpec[1];

            switch (paramKey)
            {
            case "BuildSettings":
                var buildSettings = JsonConvert.DeserializeObject <dynamic>(paramValue);
                return(new BuildSettings
                {
                    ProjectsToBuild = ((JArray)buildSettings.ProjectsToBuild).ToObject <StringList>(),
                    PlatformConfigurations = ((JArray)buildSettings.ConfigurationsToBuild).ToObject <PlatformConfigurationList>()
                });

            case "AgentSettings":
                var agentSettings = JsonConvert.DeserializeObject <dynamic>(paramValue);
                if (agentSettings.TfvcAgentSettings != null)
                {
                    AgentSettingsBuildParameter tfvcAgentSettings = ((JObject)agentSettings.TfvcAgentSettings).ToObject <AgentSettingsBuildParameter>();
                    return((AgentSettings)tfvcAgentSettings);
                }

                if (agentSettings.GitAgentSettings != null)
                {
                    return(((JObject)agentSettings.GitAgentSettings).ToObject <BuildParameter>());
                }

                throw new InvalidOperationException(paramKey + " isn't supported for the specified value. Try { \"TfvcAgentSettings\": {your settings} } or { \"GitAgentSettings\": {your settings}");

            case "TestSpecs":
                goto case "AgileTestSpecs";

            case "AgileTestSpecs":
                return(JsonConvert.DeserializeObject <List <ExportedAgileTestPlatformSpec> >(paramValue).ToSpecList());

            default:
                return(paramValue);
            }
        }
        private static void ExportDefinition(BuildDefinitionViewModel b, string filePath)
        {
            ExportedBuildDefinition buildToExport = new ExportedBuildDefinition { Name = b.BuildDefinition.Name, Description = b.BuildDefinition.Description };
            if (b.BuildDefinition.BuildController != null)
            {
                buildToExport.BuildController = b.BuildDefinition.BuildController.Name;
            }

            buildToExport.ContinuousIntegrationType = b.BuildDefinition.ContinuousIntegrationType;
            buildToExport.DefaultDropLocation = b.BuildDefinition.DefaultDropLocation;
            buildToExport.Schedules = new List<ExportedISchedule>();

            foreach (var schedule in b.BuildDefinition.Schedules)
            {
                buildToExport.Schedules.Add(new ExportedISchedule { StartTime = schedule.StartTime, DaysToBuild = schedule.DaysToBuild, TimeZone = schedule.TimeZone });
            }

            buildToExport.SourceProviders = new List<ExportedIBuildDefinitionSourceProvider>();
            foreach (var provider in b.BuildDefinition.SourceProviders)
            {
                buildToExport.SourceProviders.Add(new ExportedIBuildDefinitionSourceProvider { Fields = provider.Fields, Name = provider.Name, SupportedTriggerTypes = provider.SupportedTriggerTypes });
            }

            buildToExport.QueueStatus = b.BuildDefinition.QueueStatus;
            buildToExport.ContinuousIntegrationQuietPeriod = b.BuildDefinition.ContinuousIntegrationQuietPeriod;

            if (b.BuildDefinition.SourceProviders.All(s => s.Name != "TFGIT"))
            {
                buildToExport.Mappings = new List<ExportedIWorkspaceMapping>();
                foreach (var map in b.BuildDefinition.Workspace.Mappings)
                {
                    buildToExport.Mappings.Add(new ExportedIWorkspaceMapping { Depth = map.Depth, LocalItem = map.LocalItem, MappingType = map.MappingType, ServerItem = map.ServerItem });
                }
            }

            buildToExport.RetentionPolicyList = new List<ExportedIRetentionPolicy>();
            foreach (var rp in b.BuildDefinition.RetentionPolicyList)
            {
                buildToExport.RetentionPolicyList.Add(new ExportedIRetentionPolicy { BuildDefinition = rp.BuildDefinition, BuildReason = rp.BuildReason, BuildStatus = rp.BuildStatus, NumberToKeep = rp.NumberToKeep, DeleteOptions = rp.DeleteOptions });
            }

            if (b.BuildDefinition.Process != null)
            {
                buildToExport.ProcessTemplate = b.BuildDefinition.Process.ServerPath;
            }

            var processParameters = WorkflowHelpers.DeserializeProcessParameters(b.BuildDefinition.ProcessParameters);
            if (processParameters.ContainsKey("AgentSettings"))
            {
                if (processParameters["AgentSettings"].GetType() == typeof(AgentSettings))
                {
                    AgentSettings ags = (AgentSettings)processParameters["AgentSettings"];
                    AgentSettingsBuildParameter agentSet = new AgentSettingsBuildParameter();
                    agentSet.MaxExecutionTime = ags.MaxExecutionTime;
                    agentSet.MaxWaitTime = ags.MaxWaitTime;
                    agentSet.Name = ags.Name;
                    agentSet.Comparison = ags.TagComparison;
                    agentSet.Tags = ags.Tags;
                    buildToExport.TfvcAgentSettings = agentSet;
                }
                else if (processParameters["AgentSettings"].GetType() == typeof(BuildParameter))
                {
                    BuildParameter ags = (BuildParameter)processParameters["AgentSettings"];
                    {
                        buildToExport.GitAgentSettings = ags;
                    }
                }
            }

            buildToExport.ProcessParameters = WorkflowHelpers.DeserializeProcessParameters(b.BuildDefinition.ProcessParameters);

            File.WriteAllText(Path.Combine(filePath, b.Name + ".json"), JsonConvert.SerializeObject(buildToExport, Formatting.Indented));
        }
        public static void ExportDefinition(BuildDefinitionViewModel b, string filePath)
        {
            ExportedBuildDefinition buildToExport = new ExportedBuildDefinition { Name = b.BuildDefinition.Name, Description = b.BuildDefinition.Description };
            if (b.BuildDefinition.BuildController != null)
            {
                buildToExport.BuildController = b.BuildDefinition.BuildController.Name;
            }

            buildToExport.ContinuousIntegrationType = b.BuildDefinition.ContinuousIntegrationType;
            buildToExport.DefaultDropLocation = b.BuildDefinition.DefaultDropLocation;
            buildToExport.Schedules = new List<ExportedISchedule>();

            foreach (var schedule in b.BuildDefinition.Schedules)
            {
                buildToExport.Schedules.Add(new ExportedISchedule { StartTime = schedule.StartTime, DaysToBuild = schedule.DaysToBuild, TimeZone = schedule.TimeZone });
            }

            buildToExport.SourceProviders = new List<ExportedIBuildDefinitionSourceProvider>();
            foreach (var provider in b.BuildDefinition.SourceProviders)
            {
                buildToExport.SourceProviders.Add(new ExportedIBuildDefinitionSourceProvider { Fields = provider.Fields, Name = provider.Name, SupportedTriggerTypes = provider.SupportedTriggerTypes });
            }

            buildToExport.QueueStatus = b.BuildDefinition.QueueStatus;
            buildToExport.ContinuousIntegrationQuietPeriod = b.BuildDefinition.ContinuousIntegrationQuietPeriod;

            if (b.BuildDefinition.SourceProviders.All(s => s.Name != "TFGIT"))
            {
                buildToExport.Mappings = new List<ExportedIWorkspaceMapping>();
                foreach (var map in b.BuildDefinition.Workspace.Mappings)
                {
                    buildToExport.Mappings.Add(new ExportedIWorkspaceMapping { Depth = map.Depth, LocalItem = map.LocalItem, MappingType = map.MappingType, ServerItem = map.ServerItem });
                }
            }

            buildToExport.RetentionPolicyList = new List<ExportedIRetentionPolicy>();
            foreach (var rp in b.BuildDefinition.RetentionPolicyList)
            {
                buildToExport.RetentionPolicyList.Add(new ExportedIRetentionPolicy { BuildDefinition = rp.BuildDefinition, BuildReason = rp.BuildReason, BuildStatus = rp.BuildStatus, NumberToKeep = rp.NumberToKeep, DeleteOptions = rp.DeleteOptions });
            }

            if (b.BuildDefinition.Process != null)
            {
                buildToExport.ProcessTemplate = b.BuildDefinition.Process.ServerPath;
            }

            var processParameters = WorkflowHelpers.DeserializeProcessParameters(b.BuildDefinition.ProcessParameters);
            if (processParameters.ContainsKey("AgentSettings"))
            {
                if (processParameters["AgentSettings"].GetType() == typeof(AgentSettings))
                {
                    AgentSettings ags = (AgentSettings)processParameters["AgentSettings"];
                    AgentSettingsBuildParameter agentSet = new AgentSettingsBuildParameter();
                    agentSet.MaxExecutionTime = ags.MaxExecutionTime;
                    agentSet.MaxWaitTime = ags.MaxWaitTime;
                    agentSet.Name = ags.Name;
                    agentSet.Comparison = ags.TagComparison;
                    agentSet.Tags = ags.Tags;
                    buildToExport.TfvcAgentSettings = agentSet;
                }
                else if (processParameters["AgentSettings"].GetType() == typeof(BuildParameter))
                {
                    BuildParameter ags = (BuildParameter)processParameters["AgentSettings"];
                    {
                        buildToExport.GitAgentSettings = ags;
                    }
                }
            }

            if (processParameters.ContainsKey("BuildSettings"))
            {
                var buildSettings = processParameters["BuildSettings"] as BuildSettings;
                if (buildSettings != null && buildSettings.HasProjectsToBuild)
                {
                    buildToExport.ProjectsToBuild = buildSettings.ProjectsToBuild;
                    if (buildSettings.HasPlatformConfigurations)
                    {
                        buildToExport.ConfigurationsToBuild = buildSettings.PlatformConfigurations;
                    }
                }
            }

            if (processParameters.ContainsKey("TestSpecs"))
            {
                var testSpecs = processParameters["TestSpecs"] as TestSpecList;
                if (testSpecs != null)
                {
                    buildToExport.AgileTestSpecs = new List<ExportedAgileTestPlatformSpec>();
                    foreach (var spec in testSpecs)
                    {
                        var agilespec = spec as AgileTestPlatformSpec;
                        if (agilespec != null)
                        {
                            ExportedAgileTestPlatformSpec expAgileSpec = new ExportedAgileTestPlatformSpec();
                            expAgileSpec.AssemblyFileSpec = agilespec.AssemblyFileSpec;
                            expAgileSpec.ExecutionPlatform = agilespec.ExecutionPlatform;
                            expAgileSpec.FailBuildOnFailure = agilespec.FailBuildOnFailure;
                            expAgileSpec.RunName = agilespec.RunName;
                            expAgileSpec.TestCaseFilter = agilespec.TestCaseFilter;
                            expAgileSpec.RunSettingsFileName = agilespec.RunSettingsForTestRun.ServerRunSettingsFile;
                            expAgileSpec.TypeRunSettings = agilespec.RunSettingsForTestRun.TypeRunSettings;
                            buildToExport.AgileTestSpecs.Add(expAgileSpec);
                        }
                    }
                }
            }

            buildToExport.ProcessParameters = WorkflowHelpers.DeserializeProcessParameters(b.BuildDefinition.ProcessParameters);
            foreach (KeyValuePair<string, object> item in processParameters)
            {
                if (item.Value.GetType() == typeof(Microsoft.TeamFoundation.Build.Common.BuildParameter))
                {
                    buildToExport.ProcessParameters[item.Key] = JsonConvert.DeserializeObject(item.Value.ToString());
                }
                else if (item.Value.GetType() == typeof(BuildReason))
                {
                    buildToExport.BuildReasons.Add(item.Key, (BuildReason)item.Value);
                }
                else if (item.Value is int)
                {
                    buildToExport.IntegerParameters.Add(item.Key, (int)item.Value);
                }
                else if (item.Value.GetType() == typeof(BuildVerbosity))
                {
                    buildToExport.BuildVerbosities.Add(item.Key, (BuildVerbosity)item.Value);
                }
            }

            var jsonSerializerSettings = new JsonSerializerSettings
            {
                PreserveReferencesHandling = PreserveReferencesHandling.Objects,
                ReferenceLoopHandling = ReferenceLoopHandling.Serialize
            };

            File.WriteAllText(Path.Combine(filePath, b.Name + ".json"), JsonConvert.SerializeObject(buildToExport, Formatting.Indented, jsonSerializerSettings));
        }