summaryrefslogtreecommitdiff
path: root/src/net/tuschhcm/routercontrol/Preset.java
blob: 2a408e91d220064f2adb0b78bc853b97c86684bf (plain)
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
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
package net.tuschhcm.routercontrol;

import java.io.BufferedReader;
import java.io.File;
import java.io.FileReader;
import java.io.IOException;

import java.text.ParseException;

import java.util.ArrayList;
import java.util.Map;
import java.util.HashMap;

/**
 * Class to represent a router preset.
 */
public class Preset {
    private static final String UNNAMED = "";

    /**
     * Name of the preset.
     */
    private String mName;

    /**
     * List of inputs for outputs.
     * List index corresponds with the output.
     */
    private final ArrayList<Integer> mInputs;

    /**
     * Load the presets from a given file.
     *
     * @param file The file to load.
     * @return A list of Presets
     * @throws ParseException if the presets file can't be parsed.
     * @throws IOException if the file can't be read.
     */
    public static Map<Integer, Preset> loadPresetsFile(File file)
        throws ParseException, IOException {
        
        final Map<Integer, Preset> map = new HashMap<Integer, Preset>();
        final BufferedReader in = new BufferedReader(new FileReader(file));

        try {
            int lineno = 0;
            String line;

            while ((line = in.readLine()) != null) {
                lineno++; // Inc. the line count immediately after the read.

                line = line.trim();
                if (line.equals("")) {
                    continue;
                }

                try {
                    map.put(lineno, Preset.fromString(line.trim()));

                } catch (IllegalArgumentException e) {
                    throw new ParseException("Malformed preset on line " + lineno
                            + ": " + e.getMessage(), lineno);
                }
            }

            return map;

        } finally {
            in.close();
        }
    }

    /**
     * Load a preset from a String.
     * @param line The string to parse.
     * @return The Preset defined by the string.
     * @throws IllegalArgumentException if the string is malformed.
     */
    public static Preset fromString(String line) {
        final Preset p = new Preset();

        boolean inInput = false;
        int start = 0;
        for (int i = 0; i < line.length(); i++) {
            char c = line.charAt(i);

            if (inInput && Character.isWhitespace(c)) {
                // End of current input
                Integer input = Integer.valueOf(line.substring(start, i));
                p.mInputs.add(input);
                inInput = false;
                start = i + 1;

            } else if (!inInput && c == '#') {
                // Start comment
                // Ignore empty comments.
                if ((i+1) < line.length()) {
                    p.mName = line.substring(i+1).trim();
                }
                break; // end loop

            } else if (Character.isDigit(c)) {
                inInput = true;

            } else {
                throw new IllegalArgumentException("Unexpected character '" + c + "' at position "
                        + (i+1) + ". (inInput = " + inInput +")");
            }
        }

        if (inInput) {
            // One last input at the end of the line.
            Integer input = Integer.valueOf(line.substring(start));
            p.mInputs.add(input);
        }

        return p;
    }

    /**
     * Constructor for Preset.
     */
    public Preset() {
        mName = UNNAMED;
        mInputs = new ArrayList<Integer>();
    }

    /**
     * Get the name of the preset.
     *
     * @return The preset name
     */
    public String getName() {
        return mName;
    }

    /**
     * Get an input for the given output.
     *
     * @param output
     * @return Input number, or 0 if no change.
     * @throws IllegalArgumentException if the output isn't defined.
     */
    public int getInputForOutput(final int output) {
        final int index = output - 1;
        if (index < 0 || index > mInputs.size()) {
            throw new IllegalArgumentException("Output out of range.");
        }

        return mInputs.get(index);
    }

    /**
     * @return The number of outputs defined in this preset.
     */
    public int getNumberOfOutputs() {
        return mInputs.size();
    }

    /**
     * Return a string representation of this preset.
     */
    public String toString() {
        String str = "";
        for (Integer in : mInputs) {
            str += in + " ";
        }
        
        if (!mName.equals(UNNAMED)) {
            str += "# " + mName;
        }

        return str;
    }
}