/// <summary> Configure the launcher from the provided properties, system name
        /// 
        /// </summary>
        /// <param name="launcher">The launcher to configure
        /// </param>
        /// <param name="systemName">The name of the system we're configuring
        /// </param>
        /// <param name="props">The Properties object with our configuration information
        /// </param>
        /// <throws>  IllegalArgumentException if a required parameter is missing </throws>
        /// <throws>  MigrationException if there is problem setting the context into the launcher </throws>
        //UPGRADE_ISSUE: Class hierarchy differences between 'java.util.Properties' and 'System.Collections.Specialized.NameValueCollection' may cause compilation errors. "ms-help://MS.VSCC.v80/dv_commoner/local/redirect.htm?index='!DefaultContextWindowIndex'&keyword='jlca1186'"
        private void configureFromMigrationProperties(DistributedAdoMigrationLauncher launcher, System.String systemName, System.Collections.Specialized.NameValueCollection props)
        {
            // Get the name of the context to use for our patch information
            System.String patchStoreContextName = null;//getRequiredParam(props, systemName + ".context");

            // Set up the data source
            /* TODO
            dataSource.DriverClass = getRequiredParam(props, patchStoreContextName + ".ado.driver");
            dataSource.DatabaseUrl = getRequiredParam(props, patchStoreContextName + ".ado.url");
            dataSource.Username = getRequiredParam(props, patchStoreContextName + ".ado.username");
            dataSource.Password = getRequiredParam(props, patchStoreContextName + ".ado.password");
            */
            // Get any post-patch task paths
            launcher.PostPatchPath = props.Get(patchStoreContextName + ".postpatch.path");

            // Set up the ADO migration context; accepts one of two property names
            DataSourceMigrationContext context = DataSourceMigrationContext;
            System.String databaseType = null;// getRequiredParam(props, patchStoreContextName + ".ado.database.type", patchStoreContextName + ".ado.dialect");
            context.DatabaseType = new DatabaseType(databaseType);

            // Finish setting up the context
            context.SystemName = systemName;
            //context.DataSource = dataSource;

            // done reading in config, set launcher's context
            launcher.AddContext(context);

            // Get our controlled systems, and instantiate their launchers
            //UPGRADE_TODO: Class 'java.util.HashMap' was converted to 'System.Collections.Hashtable' which has a different behavior. "ms-help://MS.VSCC.v80/dv_commoner/local/redirect.htm?index='!DefaultContextWindowIndex'&keyword='jlca1073_javautilHashMap'"
            System.Collections.Hashtable controlledSystems = new System.Collections.Hashtable();
            System.String[] controlledSystemNames = null;// getRequiredParam(props, systemName + ".controlled.systems").split(",");
            for (int i = 0; i < controlledSystemNames.Length; i++)
            {
                log.Info("Creating controlled migration launcher for system " + controlledSystemNames[i]);
                AdoMigrationLauncherFactory factory = AdoMigrationLauncherFactoryLoader.createFactory();
                AdoMigrationLauncher subLauncher = factory.createMigrationLauncher(controlledSystemNames[i]);
                controlledSystems[controlledSystemNames[i]] = subLauncher;

                // Make sure the controlled migration process gets migration events
                //launcher.MigrationProcess.addListener(subLauncher);
                launcher.MigrationProcess.MigrationStarted += new MigrationProcess.MigrationStatusEventHandler(subLauncher.MigrationStarted);
                launcher.MigrationProcess.MigrationSuccessful += new MigrationProcess.MigrationStatusEventHandler(subLauncher.MigrationSuccessful);
                launcher.MigrationProcess.MigrationFailed += new MigrationProcess.MigrationStatusEventHandler(subLauncher.MigrationFailed);
            }

            // communicate our new-found controlled systems to the migration process
            // TODO ((DistributedMigrationProcess)launcher.MigrationProcess).ControlledSystems = null;// controlledSystems;
        }
        /// <summary> Loads the configuration from the migration config properties file.
        /// 
        /// </summary>
        /// <param name="launcher">the launcher to configure
        /// </param>
        /// <param name="systemName">the name of the system
        /// </param>
        /// <throws>  MigrationException if an unexpected error occurs </throws>
        private void configureFromMigrationProperties(DistributedAdoMigrationLauncher launcher, System.String systemName)
        {
            //UPGRADE_ISSUE: Class 'java.lang.ClassLoader' was not converted. "ms-help://MS.VSCC.v80/dv_commoner/local/redirect.htm?index='!DefaultContextWindowIndex'&keyword='jlca1000_javalangClassLoader'"
            //UPGRADE_ISSUE: Method 'java.lang.Thread.getContextClassLoader' was not converted. "ms-help://MS.VSCC.v80/dv_commoner/local/redirect.htm?index='!DefaultContextWindowIndex'&keyword='jlca1000_javalangThreadgetContextClassLoader'"
            //ClassLoader cl = SupportClass.ThreadClass.Current().getContextClassLoader();
            //UPGRADE_ISSUE: Method 'java.lang.ClassLoader.getResourceAsStream' was not converted. "ms-help://MS.VSCC.v80/dv_commoner/local/redirect.htm?index='!DefaultContextWindowIndex'&keyword='jlca1000_javalangClassLoader'"
            System.IO.Stream is_Renamed = null;// cl.getResourceAsStream(com.tacitknowledge.util.migration.MigrationContext_Fields.MIGRATION_CONFIG_FILE);
            if (is_Renamed != null)
            {
                try
                {
                    //UPGRADE_ISSUE: Class hierarchy differences between 'java.util.Properties' and 'System.Collections.Specialized.NameValueCollection' may cause compilation errors. "ms-help://MS.VSCC.v80/dv_commoner/local/redirect.htm?index='!DefaultContextWindowIndex'&keyword='jlca1186'"
                    //UPGRADE_TODO: Format of property file may need to be changed. "ms-help://MS.VSCC.v80/dv_commoner/local/redirect.htm?index='!DefaultContextWindowIndex'&keyword='jlca1089'"
                    System.Collections.Specialized.NameValueCollection props = new System.Collections.Specialized.NameValueCollection();
                    //UPGRADE_TODO: Method 'java.util.Properties.load' was converted to 'System.Collections.Specialized.NameValueCollection' which has a different behavior. "ms-help://MS.VSCC.v80/dv_commoner/local/redirect.htm?index='!DefaultContextWindowIndex'&keyword='jlca1073_javautilPropertiesload_javaioInputStream'"
                    props = new System.Collections.Specialized.NameValueCollection(System.Configuration.ConfigurationManager.AppSettings);

                    configureFromMigrationProperties(launcher, systemName, props);
                }
                catch (System.IO.IOException e)
                {
                    throw new MigrationException("Error reading in migration properties file", e);
                }
                finally
                {
                    try
                    {
                        is_Renamed.Close();
                    }
                    catch (System.IO.IOException ioe)
                    {
                        throw new MigrationException("Error closing migration properties file", ioe);
                    }
                }
            }
            else
            {
                throw new MigrationException("Unable to find migration properties file '"/* TODO + com.tacitknowledge.util.migration.MigrationContext_Fields.MIGRATION_CONFIG_FILE*/ + "'");
            }
        }