protected override StageResult Init()
        {
            if (!Success(base.Init(), out StageResult r))
            {
                return(r);
            }

            if (JavaHome.IsEmpty())
            {
                if (AdditionalOptions.ContainsKey("JAVA_HOME"))
                {
                    JavaHome = (string)AdditionalOptions["JAVA_HOME"];
                }
                else if ((JavaHome = Environment.GetEnvironmentVariable("JAVA_HOME")).IsEmpty())
                {
                    Error("The java-home or JAVA_HOME option was not specified and the JAVA_HOME environment variable does not exist.");
                    return(StageResult.INVALID_OPTIONS);
                }
            }
            if (!Directory.Exists(JavaHome))
            {
                Error("The Java home directory specified does not exist: {0}.", JavaHome);
                return(StageResult.INVALID_OPTIONS);
            }

            if (ClassPath.IsEmpty())
            {
                if (AdditionalOptions.ContainsKey("STANFORD_CLASSIFIER_JAR"))
                {
                    ClassPath = (string)AdditionalOptions["STANFORD_CLASSIFIER_JAR"];
                }
                else if ((ClassPath = Environment.GetEnvironmentVariable("STANFORD_CLASSIFIER_JAR")).IsEmpty())
                {
                    Error("The class-path option was not specified and the STANFORD_CLASSIFIER_JAR environment variable does not exist.");
                    return(StageResult.INVALID_OPTIONS);
                }
            }
            if (!File.Exists(ClassPath))
            {
                Error("The .jar archive path specified does not exist: {0}.", ClassPath);
                return(StageResult.INVALID_OPTIONS);
            }

            if (BinaryLogisticClassifier && !AdditionalOptions.ContainsKey("useBinary"))
            {
                AdditionalOptions.Add("useBinary", true);
            }

            if (WithKFoldCrossValidation)
            {
                ClassifierProperties.Add("crossValidationFolds", 10);
                Info("Using 10-fold cross validation");
            }

            Command version = new Command(Path.Combine(JavaHome, "bin"), "java", "-version");
            Task    c       = version.Run();

            if (!version.Started)
            {
                Error("Could not detect Java version.");
                return(StageResult.FAILED);
            }
            else
            {
                c.Wait();
                if (c.IsCompleted && version.Success)
                {
                    Info(version.ErrorText.Replace(Environment.NewLine, " "));
                }
                if (c.IsCompleted && !version.Success)
                {
                    Error("Could not detect Java version: {0}", version.OutputText);
                    return(StageResult.FAILED);
                }
            }

            foreach (KeyValuePair <string, object> kv in AdditionalOptions)
            {
                if (ClassifierProperties.ContainsKey(kv.Key))
                {
                    ClassifierProperties[kv.Key] = kv.Value;
                }
                else
                {
                    ClassifierProperties.Add(kv.Key, kv.Value);
                }
                Info("Using additional classifier property {0}={1}.", kv.Key, kv.Value);
            }

            if (ClassifierProperties.ContainsKey("useNB"))
            {
                ClassifierProperties.Remove("useBinary");
            }

            return(StageResult.SUCCESS);
        }