1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19 package org.apache.maven.shared.scriptinterpreter;
20
21 import java.io.File;
22 import java.io.IOException;
23 import java.io.OutputStream;
24 import java.io.PrintStream;
25 import java.nio.file.Files;
26
27
28
29
30 public class FileLogger implements ExecutionLogger, AutoCloseable {
31
32
33
34
35 private File file;
36
37
38
39
40 private PrintStream stream;
41
42
43
44
45
46
47
48 public FileLogger(File outputFile) throws IOException {
49 this(outputFile, null);
50 }
51
52
53
54
55
56
57
58
59 public FileLogger(File outputFile, FileLoggerMirrorHandler mirrorHandler) throws IOException {
60 this.file = outputFile;
61
62 OutputStream outputStream;
63
64 if (outputFile != null) {
65 outputFile.getParentFile().mkdirs();
66 outputStream = Files.newOutputStream(outputFile.toPath());
67 } else {
68 outputStream = new NullOutputStream();
69 }
70
71 if (mirrorHandler != null) {
72 stream = new PrintStream(new MirrorStreamWrapper(outputStream, mirrorHandler));
73 } else {
74 stream = new PrintStream(outputStream);
75 }
76 }
77
78
79
80
81
82
83 public File getOutputFile() {
84 return file;
85 }
86
87
88
89
90
91
92 @Override
93 public PrintStream getPrintStream() {
94 return stream;
95 }
96
97
98
99
100
101
102
103 @Override
104 public void consumeLine(String line) {
105 stream.println(line);
106 stream.flush();
107 }
108
109
110
111
112 public void close() {
113 if (stream != null) {
114 stream.flush();
115 stream.close();
116 stream = null;
117 }
118 }
119
120 private static class MirrorStreamWrapper extends OutputStream {
121 private OutputStream out;
122
123 private final FileLoggerMirrorHandler mirrorHandler;
124
125 private StringBuilder lineBuffer;
126
127 MirrorStreamWrapper(OutputStream outputStream, FileLoggerMirrorHandler mirrorHandler) {
128 this.out = outputStream;
129 this.mirrorHandler = mirrorHandler;
130 this.lineBuffer = new StringBuilder();
131 }
132
133 @Override
134 public void write(int b) throws IOException {
135 out.write(b);
136 lineBuffer.append((char) (b));
137 }
138
139 @Override
140 public void write(byte[] b, int off, int len) throws IOException {
141 out.write(b, off, len);
142 lineBuffer.append(new String(b, off, len));
143 }
144
145 @Override
146 public void flush() throws IOException {
147 out.flush();
148
149 int len = lineBuffer.length();
150 if (len == 0) {
151
152 return;
153 }
154
155
156 while (len > 0 && (lineBuffer.charAt(len - 1) == '\n' || lineBuffer.charAt(len - 1) == '\r')) {
157 len--;
158 }
159 lineBuffer.setLength(len);
160
161 mirrorHandler.consumeOutput(lineBuffer.toString());
162
163
164 lineBuffer = new StringBuilder();
165 }
166
167 @Override
168 public void close() throws IOException {
169 flush();
170 if (out != null) {
171 out.close();
172 out = null;
173 }
174 }
175 }
176
177 private static class NullOutputStream extends OutputStream {
178 @Override
179 public void write(int b) {
180
181 }
182
183 @Override
184 public void write(byte[] b, int off, int len) {
185
186 }
187 }
188 }