• Home
  • Features
  • Pricing
  • Docs
  • Announcements
  • Sign In

hazendaz / httpunit / 636

05 Dec 2025 03:27AM UTC coverage: 80.509%. Remained the same
636

push

github

hazendaz
Cleanup more old since tags

you guessed it, at this point going to jautodoc the rest so the warnings on builds go away ;)

3213 of 4105 branches covered (78.27%)

Branch coverage included in aggregate %.

8249 of 10132 relevant lines covered (81.42%)

0.81 hits per line

Source File
Press 'n' to go to next uncovered line, 'b' for previous

22.61
/src/main/java/com/meterware/httpunit/parsing/JTidyPrintWriter.java
1
/*
2
 * MIT License
3
 *
4
 * Copyright 2011-2025 Russell Gold
5
 *
6
 * Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated
7
 * documentation files (the "Software"), to deal in the Software without restriction, including without limitation
8
 * the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and
9
 * to permit persons to whom the Software is furnished to do so, subject to the following conditions:
10
 *
11
 * The above copyright notice and this permission notice shall be included in all copies or substantial portions
12
 * of the Software.
13
 *
14
 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO
15
 * THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
16
 * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF
17
 * CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
18
 * DEALINGS IN THE SOFTWARE.
19
 */
20
package com.meterware.httpunit.parsing;
21

22
import java.io.PrintWriter;
23
import java.net.URL;
24
import java.text.DecimalFormat;
25
import java.text.NumberFormat;
26
import java.text.ParseException;
27
import java.util.List;
28
import java.util.StringTokenizer;
29

30
/**
31
 * Basic "parser" for the JTidy error output. Will get the line and column number as well as the message. It assumes
32
 * that an error or warning is to be logged once println() has been called or if a string starts with "line"
33
 **/
34
class JTidyPrintWriter extends PrintWriter {
35
    /**
36
     * DecimalFormat.getNumberInstance() should provide us with a proper formatter for the default locale. The integers
37
     * returned from JTidy contain the appropriate decimal separator for the current locale.
38
     */
39
    private static final NumberFormat INTEGER_FORMAT = DecimalFormat.getNumberInstance();
1✔
40

41
    JTidyPrintWriter(URL pageURL) {
42
        super(System.out);
1✔
43
        _url = pageURL;
1✔
44
    }
1✔
45

46
    @Override
47
    public void print(boolean b) {
48
        print(String.valueOf(b));
×
49
    }
×
50

51
    @Override
52
    public void print(char c) {
53
        print(String.valueOf(c));
×
54
    }
×
55

56
    @Override
57
    public void print(char[] s) {
58
        print(String.valueOf(s));
×
59
    }
×
60

61
    @Override
62
    public void print(double d) {
63
        print(String.valueOf(d));
×
64
    }
×
65

66
    @Override
67
    public void print(float f) {
68
        print(String.valueOf(f));
×
69
    }
×
70

71
    @Override
72
    public void print(int i) {
73
        print(String.valueOf(i));
×
74
    }
×
75

76
    @Override
77
    public void print(long l) {
78
        print(String.valueOf(l));
×
79
    }
×
80

81
    @Override
82
    public void print(Object obj) {
83
        print(obj.toString());
×
84
    }
×
85

86
    /**
87
     * Detects a new log if starting with "line", a warning if message starts with "Warning" and an error if it starts
88
     * with "Error"
89
     **/
90
    @Override
91
    public void print(String s) {
92
        if (s.startsWith("line")) {
1!
93
            if (!_logged && _line > 0 && _msg != null && _msg.length() > 0) {
1!
94
                log(); // log previous!!!
×
95
            }
96
            _logged = false; // new error....
1✔
97
            StringTokenizer tok = new StringTokenizer(s);
1✔
98
            // skip first "line"
99
            tok.nextToken();
1✔
100
            // get line
101
            _line = parseInteger(tok.nextToken());
1✔
102
            // skip second "column"
103
            tok.nextToken();
1✔
104
            // get column
105
            _column = parseInteger(tok.nextToken());
1✔
106
        } else if (s.startsWith("Warning")) {
1!
107
            _error = false;
×
108
            _msg = s;
×
109
        } else if (s.startsWith("Error")) {
×
110
            _error = true;
×
111
            _msg = s;
×
112
        } else {
113
            // non structured msg
114
            _msg += s;
×
115
        }
116
    }
1✔
117

118
    private int parseInteger(String integer) {
119
        try {
120
            return INTEGER_FORMAT.parse(integer).intValue();
1✔
121
        } catch (ParseException e) {
×
122
            throw new NumberFormatException("Unable to parse integer [int: " + integer + ", error: " + e.getMessage());
×
123
        }
124
    }
125

126
    @Override
127
    public void println() {
128
        if (!_logged) {
×
129
            log();
×
130
        }
131
    }
×
132

133
    @Override
134
    public void println(boolean x) {
135
        print(String.valueOf(x));
×
136
        println();
×
137
    }
×
138

139
    @Override
140
    public void println(char c) {
141
        print(String.valueOf(c));
×
142
        println();
×
143
    }
×
144

145
    @Override
146
    public void println(char[] c) {
147
        print(String.valueOf(c));
×
148
        println();
×
149
    }
×
150

151
    @Override
152
    public void println(double d) {
153
        print(String.valueOf(d));
×
154
        println();
×
155
    }
×
156

157
    @Override
158
    public void println(float f) {
159
        print(String.valueOf(f));
×
160
        println();
×
161
    }
×
162

163
    @Override
164
    public void println(int i) {
165
        print(String.valueOf(i));
×
166
        println();
×
167
    }
×
168

169
    @Override
170
    public void println(long l) {
171
        print(String.valueOf(l));
×
172
        println();
×
173
    }
×
174

175
    @Override
176
    public void println(Object o) {
177
        print(o.toString());
×
178
        println();
×
179
    }
×
180

181
    @Override
182
    public void println(String s) {
183
        print(s);
×
184
        println();
×
185
    }
×
186

187
    // ----------------------------------------------- private members
188
    // ------------------------------------------------------
189

190
    private int _line = -1;
1✔
191
    private int _column = -1;
1✔
192
    private String _msg = "";
1✔
193
    private boolean _error = false;
1✔
194
    private boolean _logged = false;
1✔
195
    private URL _url;
196

197
    /**
198
     * reports the warning or error and then resets the current error/warning.
199
     **/
200
    private void log() {
201
        // System.out.println("Logging.........................");
202
        if (_error) {
×
203
            reportError(_msg, _line, _column);
×
204
        } else {
205
            reportWarning(_msg, _line, _column);
×
206
        }
207
        _logged = true;
×
208
        _line = -1;
×
209
        _column = -1;
×
210
        _msg = "";
×
211
    }
×
212

213
    private void reportError(String msg, int line, int column) {
214
        List<HTMLParserListener> listeners = HTMLParserFactory.getHTMLParserListeners();
×
215
        for (HTMLParserListener listener : listeners) {
×
216
            listener.error(_url, msg, line, column);
×
217
        }
×
218
    }
×
219

220
    private void reportWarning(String msg, int line, int column) {
221
        List<HTMLParserListener> listeners = HTMLParserFactory.getHTMLParserListeners();
×
222
        for (HTMLParserListener listener : listeners) {
×
223
            listener.warning(_url, msg, line, column);
×
224
        }
×
225
    }
×
226
}
STATUS · Troubleshooting · Open an Issue · Sales · Support · CAREERS · ENTERPRISE · START FREE · SCHEDULE DEMO
ANNOUNCEMENTS · TWITTER · TOS & SLA · Supported CI Services · What's a CI service? · Automated Testing

© 2026 Coveralls, Inc