1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
package Torello.Java;

import java.io.File;
import java.util.Map;
import java.util.function.Consumer;

/**
 * This class allows for the user to provide redirects, environment variables, and output/error
 * unification (meaning the Standard-Output and Error-Output Streams are printed together, as if
 * they were being printed to the terminal).
 * 
 * <EMBED CLASS='external-html' DATA-FILE-ID=OSEXTRAS>
 */
@SuppressWarnings("overrides") // The 'equals(other) causes a warning about hashCode
public class OSExtras implements Cloneable
{
    /** <EMBED CLASS='external-html' DATA-FILE-ID=OSE_CUR_WDIR> */
    public File currentWorkingDirectory = null;

    /** <EMBED CLASS='external-html' DATA-FILE-ID=OSE_MERGE_IE> */
    public boolean mergeStdErrorAndStdOut = false;

    /** <EMBED CLASS='external-html' DATA-FILE-ID=OSE_OUT_REDIR> */
    public ProcessBuilder.Redirect outputRedirect = null;

    /** <EMBED CLASS='external-html' DATA-FILE-ID=OSE_INP_REDIR> */
    public ProcessBuilder.Redirect inputRedirect = null;

    /** <EMBED CLASS='external-html' DATA-FILE-ID=OSE_ERR_REDIR> */
    public ProcessBuilder.Redirect errorRedirect = null;

    /** <EMBED CLASS='external-html' DATA-FILE-ID=OSE_ENV_UPDT> */
    public Consumer<Map<String, String>> environmentVariableUpdater = null;

    /** Builds a new instance of this class, and keeps the default values assigned. */
    public OSExtras() { }

    /**
     * Constructs an instance of this class
     * @param currentWorkingDirectory <EMBED CLASS='external-html' DATA-FILE-ID=OSE_CUR_WDIR>
     * @param mergeStdErrorAndStdOut <EMBED CLASS='external-html' DATA-FILE-ID=OSE_MERGE_IE>
     * @param outputRedirect <EMBED CLASS='external-html' DATA-FILE-ID=OSE_OUT_REDIR>
     * @param inputRedirect <EMBED CLASS='external-html' DATA-FILE-ID=OSE_INP_REDIR>
     * @param errorRedirect <EMBED CLASS='external-html' DATA-FILE-ID=OSE_ERR_REDIR>
     * @param environmentVariableUpdater <EMBED CLASS='external-html' DATA-FILE-ID=OSE_ENV_UPDT>
     */
    public OSExtras(
           File                            currentWorkingDirectory,
           boolean                         mergeStdErrorAndStdOut,
           ProcessBuilder.Redirect         outputRedirect,
           ProcessBuilder.Redirect         inputRedirect,
           ProcessBuilder.Redirect         errorRedirect,
           Consumer<Map<String, String>>   environmentVariableUpdater
        )
    {
        this.currentWorkingDirectory    = currentWorkingDirectory;
        this.mergeStdErrorAndStdOut     = mergeStdErrorAndStdOut;
        this.outputRedirect             = outputRedirect;
        this.inputRedirect              = inputRedirect;
        this.errorRedirect              = errorRedirect;
        this.environmentVariableUpdater = environmentVariableUpdater;
    }


    // ********************************************************************************************
    // ********************************************************************************************
    // Object & Cloneable Methods
    // ********************************************************************************************
    // ********************************************************************************************


    private static String toStrApp(Object a)
    { return (a == null) ? "null\n" : (a.getClass().getName() + '\n'); }

    /**
     * Generates a {@code String} this class.  The returned {@code String} merely encodes the
     * class-names of the non-null fields.
     *     
     * @return A simple representation of this class, as a {@code java.lang.String}
     */
    public String toString()
    {
        // private static String toStrApp(Appendable a)
        // { return (a == null) ? "null\n" : (a.getClass().getName() + '\n'); }

        return
            "currentWorkingDirectory:    " + toStrApp(this.currentWorkingDirectory) +
            "mergeStdErrorAndStdOut:     " + this.mergeStdErrorAndStdOut + '\n' +
            "outputRedirect:             " + toStrApp(this.outputRedirect) +
            "inputRedirect:              " + toStrApp(this.inputRedirect) +
            "errorRedirect:              " + toStrApp(this.errorRedirect) +
            "environmentVariableUpdater: " + toStrApp(this.environmentVariableUpdater);
    }

    /**
     * Checks for equality based on whether two instances have identical references.
     *
     * @param other Any Java Object.  Only a valid sub-class of {@code OSExtras} could possibly
     * produce a {@code TRUE} return value
     *
     * @return {@code TRUE} if and only if each of the {@code OSExtras} fields are <I>identical
     * references in both {@code 'this'} and {@code 'other'}</I>.
     */
    public boolean equals(Object other)
    {
        if (other == null) return false;

        if (! OSExtras.class.isAssignableFrom(other.getClass())) return false;

        OSExtras o = (OSExtras) other;

        return 
                (this.currentWorkingDirectory       == o.currentWorkingDirectory)
            &&  (this.mergeStdErrorAndStdOut        == o.mergeStdErrorAndStdOut)
            &&  (this.outputRedirect                == o.outputRedirect)
            &&  (this.inputRedirect                 == o.inputRedirect)
            &&  (this.errorRedirect                 == o.errorRedirect)
            &&  (this.environmentVariableUpdater    == o.environmentVariableUpdater);
    }

    /**
     * Makes a copy of {@code 'this'} instance and returns it.
     * @return a clone of {@code 'this'} instance
     */
    public OSExtras clone()
    {
        return new OSExtras(
            this.currentWorkingDirectory,
            this.mergeStdErrorAndStdOut,
            this.outputRedirect,
            this.inputRedirect,
            this.errorRedirect,
            this.environmentVariableUpdater
        );
    }
}