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
package Torello.Java;

/**
 * A Java {@code 'enum'} that is used in several locations in the {@code Java-HTML JAR} Library
 * to allow an end-user to request the quantity of text being produced by a tool or application.
 * The {@link Verbose} flag / constant is designed to request the maximum amount of information
 * when running a tool, while the {@link Silent} constant may be used to ask that no textual
 * output be sent to Standard-Output
 *
 * <BR /><BR />Primarily for convenience and ease-of-use, each of the four constants in this
 * {@code enum} are assigned an integer depicting the verbosity.  When deciding whether or not
 * to print a message to the user using this {@code enum}, using the {@link #level} integer is
 * usually a more exedient coding-solution.
 *
 * <BR /><BR >The following example should help elucidate using the {@link #level} field.  Note
 * that in this particular example, the settings for {@link #Quiet} and for {@link #Silent} are
 * simply not being used.  In this example, keep in mind that the programmer may simply include
 * a message for the {@link #Quiet} setting someplace else in the code, entirely!
 * 
 * <DIV CLASS=EXAMPLE>{@code
 * // This is an extremely verbose way of coding!
 * switch (verbosity)
 * {
 *      case Silent:    
 *      case Quiet:     break;
 *      case Normal:
 *      case Verbose:   System.out.println("Starting New Program Section");
 * }
 *
 * // From a programming-analysis perspective alone, this is a lot more succint
 * if (verbosity.level >= 2) System.out.println("Starting New Program Section");
 * }</DIV>
 */
public enum Verbosity
{
    /**
     * Indicates a user-request that an application or program should not produce any output, other
     * than error-output.  In the <B>{@code Java-HTML JAR}</B> Library, error output is rarely
     * abbreviated or eliminated.
     *
     * <BR /><BR />This constant is assigned "Level 0", and the {@link #level} constant-field will
     * always be zero.
     */
    Silent(0),

    /**
     * Indicates a user-request for an application or program to run producing the minimum amount
     * of text-output possible.  Error output may (or may not) be shunted, as per the capricious
     * whims of the software guys.
     *
     * <BR /><BR />This constant is assigned "Level 1", and the {@link #level} constant-field will
     * always be one.
     */
    Quiet(1),

    /**
     * The {@code enum}-constant should be used to indicate that the default output-text be sent to
     * Standard-Output and Error-Output.
     *
     * <BR /><BR />This constant is assigned "Level 2", and the {@link #level} constant-field will
     * always be two.
     */
    Normal(2),

    /**
     * If a programmer can produce additional information about the state of a program as it runs,
     * then the {@code 'Verbose'} constant / flag may be used to indicate a user-request as such.
     *
     * <BR /><BR />This constant is assigned "Level 3", and the {@link #level} constant-field will
     * always be three.
     */
    Verbose(3);

    /**
     * There are quite a number of situations where an integer is easier for doing the comparisons
     * an actual instance of {@code 'Verbosity'}.  Each of the four constants of this {@code enum}
     * have their own, ordered, {@code 'level'} setting (which is a number between {@code '0'} and
     * {@code '3'}).
     */
    public final int level;

    private Verbosity(int level) { this.level = level; }

    /**
     * Retrieves the Enum-Constant associated with the integer parameter {@code 'verbosityLevel'}.
     * 
     * @param verbosityLevel This must be a value between {@code '0'} and {@code '3'}, or an 
     * IllegalArgumentException will throw.
     * 
     * <BR /><BR />This is used to indicate which of the four constants are to be returned by this
     * method.
     * 
     * <BR /><BR /><TABLE CLASS=JDBriefTable>
     * <TR><TH>Constant</TH>            <TH>Integer Level</TH>  </TR>
     * <TR><TD>{@link #Silent}</TD>     <TD>{@code 0}</TD>      </TR>
     * <TR><TD>{@link #Quiet}</TD>      <TD>{@code 1}</TD>      </TR>
     * <TR><TD>{@link #Normal}</TD>     <TD>{@code 2}</TD>      </TR>
     * <TR><TD>{@link #Verbose}</TD>    <TD>{@code 3}</TD>      </TR>
     * </TABLE>
     * 
     * @return The Enum-Constant associated with the input {@code 'verbosityLevel'}
     * 
     * @throws IllegalArgumentException If an integer-value other than the above four possible
     * values is provided as input.
     */
    public static Verbosity get(int verbosityLevel)
    {
        if ((verbosityLevel < 0) || (verbosityLevel > 3)) throw new IllegalArgumentException
            ("verbosityLevel=" + verbosityLevel + ", but this value must be between 0 and 3.");

        switch (verbosityLevel)
        {
            case 0: return Silent;
            case 1: return Quiet;
            case 2: return Normal;
            case 3: return Verbose;

            default: throw new UnreachableError();
        }
    }
}