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

hazendaz / httpunit / 755

14 Feb 2026 07:14PM UTC coverage: 80.526%. Remained the same
755

push

github

hazendaz
[ci] Fix badge

3213 of 4105 branches covered (78.27%)

Branch coverage included in aggregate %.

8245 of 10124 relevant lines covered (81.44%)

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
 * SPDX-License-Identifier: MIT
3
 * See LICENSE file for details.
4
 *
5
 * Copyright 2000-2026 Russell Gold
6
 * Copyright 2021-2000 hazendaz
7
 */
8
package com.meterware.httpunit.parsing;
9

10
import java.io.PrintWriter;
11
import java.net.URL;
12
import java.text.DecimalFormat;
13
import java.text.NumberFormat;
14
import java.text.ParseException;
15
import java.util.List;
16
import java.util.StringTokenizer;
17

18
/**
19
 * Basic "parser" for the JTidy error output. Will get the line and column number as well as the message. It assumes
20
 * that an error or warning is to be logged once println() has been called or if a string starts with "line"
21
 **/
22
class JTidyPrintWriter extends PrintWriter {
23
    /**
24
     * DecimalFormat.getNumberInstance() should provide us with a proper formatter for the default locale. The integers
25
     * returned from JTidy contain the appropriate decimal separator for the current locale.
26
     */
27
    private static final NumberFormat INTEGER_FORMAT = DecimalFormat.getNumberInstance();
1✔
28

29
    /**
30
     * Instantiates a new j tidy print writer.
31
     *
32
     * @param pageURL
33
     *            the page URL
34
     */
35
    JTidyPrintWriter(URL pageURL) {
36
        super(System.out);
1✔
37
        _url = pageURL;
1✔
38
    }
1✔
39

40
    @Override
41
    public void print(boolean b) {
42
        print(String.valueOf(b));
×
43
    }
×
44

45
    @Override
46
    public void print(char c) {
47
        print(String.valueOf(c));
×
48
    }
×
49

50
    @Override
51
    public void print(char[] s) {
52
        print(String.valueOf(s));
×
53
    }
×
54

55
    @Override
56
    public void print(double d) {
57
        print(String.valueOf(d));
×
58
    }
×
59

60
    @Override
61
    public void print(float f) {
62
        print(String.valueOf(f));
×
63
    }
×
64

65
    @Override
66
    public void print(int i) {
67
        print(String.valueOf(i));
×
68
    }
×
69

70
    @Override
71
    public void print(long l) {
72
        print(String.valueOf(l));
×
73
    }
×
74

75
    @Override
76
    public void print(Object obj) {
77
        print(obj.toString());
×
78
    }
×
79

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

112
    /**
113
     * Parses the integer.
114
     *
115
     * @param integer
116
     *            the integer
117
     *
118
     * @return the int
119
     */
120
    private int parseInteger(String integer) {
121
        try {
122
            return INTEGER_FORMAT.parse(integer).intValue();
1✔
123
        } catch (ParseException e) {
×
124
            throw new NumberFormatException("Unable to parse integer [int: " + integer + ", error: " + e.getMessage());
×
125
        }
126
    }
127

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

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

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

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

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

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

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

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

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

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

189
    // ----------------------------------------------- private members
190
    // ------------------------------------------------------
191

192
    /** The line. */
193
    private int _line = -1;
1✔
194

195
    /** The column. */
196
    private int _column = -1;
1✔
197

198
    /** The msg. */
199
    private String _msg = "";
1✔
200

201
    /** The error. */
202
    private boolean _error = false;
1✔
203

204
    /** The logged. */
205
    private boolean _logged = false;
1✔
206

207
    /** The url. */
208
    private URL _url;
209

210
    /**
211
     * reports the warning or error and then resets the current error/warning.
212
     **/
213
    private void log() {
214
        // System.out.println("Logging.........................");
215
        if (_error) {
×
216
            reportError(_msg, _line, _column);
×
217
        } else {
218
            reportWarning(_msg, _line, _column);
×
219
        }
220
        _logged = true;
×
221
        _line = -1;
×
222
        _column = -1;
×
223
        _msg = "";
×
224
    }
×
225

226
    /**
227
     * Report error.
228
     *
229
     * @param msg
230
     *            the msg
231
     * @param line
232
     *            the line
233
     * @param column
234
     *            the column
235
     */
236
    private void reportError(String msg, int line, int column) {
237
        List<HTMLParserListener> listeners = HTMLParserFactory.getHTMLParserListeners();
×
238
        for (HTMLParserListener listener : listeners) {
×
239
            listener.error(_url, msg, line, column);
×
240
        }
×
241
    }
×
242

243
    /**
244
     * Report warning.
245
     *
246
     * @param msg
247
     *            the msg
248
     * @param line
249
     *            the line
250
     * @param column
251
     *            the column
252
     */
253
    private void reportWarning(String msg, int line, int column) {
254
        List<HTMLParserListener> listeners = HTMLParserFactory.getHTMLParserListeners();
×
255
        for (HTMLParserListener listener : listeners) {
×
256
            listener.warning(_url, msg, line, column);
×
257
        }
×
258
    }
×
259
}
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