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 package org.slf4j.migrator;
26
27 import java.io.BufferedReader;
28 import java.io.ByteArrayInputStream;
29 import java.io.ByteArrayOutputStream;
30 import java.io.File;
31 import java.io.FileInputStream;
32 import java.io.FileOutputStream;
33 import java.io.IOException;
34 import java.io.InputStreamReader;
35 import java.io.OutputStream;
36 import java.io.Reader;
37
38 import org.slf4j.migrator.internal.ProgressListener;
39 import org.slf4j.migrator.line.LineConverter;
40 import org.slf4j.migrator.line.RuleSet;
41
42 public class InplaceFileConverter {
43
44 final static int BUFFER_LEN = 8 * 1024;
45 final LineConverter lineConverter;
46 final String lineTerminator;
47 final ProgressListener pl;
48
49 InplaceFileConverter(RuleSet ruleSet, ProgressListener pl) {
50 this.lineConverter = new LineConverter(ruleSet);
51 lineTerminator = System.getProperty("line.separator");
52 this.pl = pl;
53 }
54
55 private byte[] readIntoByteArray(File file) throws IOException {
56 FileInputStream fis = new FileInputStream(file);
57 ByteArrayOutputStream baos = new ByteArrayOutputStream();
58 int n = 0;
59 byte[] buffer = new byte[BUFFER_LEN];
60 while ((n = fis.read(buffer)) != -1) {
61
62 baos.write(buffer, 0, n);
63 }
64 fis.close();
65 return baos.toByteArray();
66 }
67
68 void convert(File file) throws IOException {
69 byte[] originalBytes = readIntoByteArray(file);
70 byte[] convertedBytes = convertIntoTempByteArray(originalBytes);
71 if (lineConverter.atLeastOneMatchOccured()) {
72
73 writeConvertedBytesIntoFile(file, convertedBytes);
74 pl.onInplaceConversion(file);
75 } else {
76
77 }
78 }
79
80 private void writeConvertedBytesIntoFile(File file, byte[] convertedBytes) throws IOException {
81 FileOutputStream fos = new FileOutputStream(file);
82 fos.write(convertedBytes);
83 fos.flush();
84 fos.close();
85 }
86
87 private byte[] convertIntoTempByteArray(byte[] input) throws IOException {
88 ByteArrayInputStream bais = new ByteArrayInputStream(input);
89 Reader reader = new InputStreamReader(bais);
90 BufferedReader breader = new BufferedReader(reader);
91 ByteArrayOutputStream baos = new ByteArrayOutputStream();
92 while (true) {
93 String line = breader.readLine();
94 if (line != null) {
95 String[] replacement = lineConverter.getReplacement(line);
96 writeReplacement(baos, replacement);
97 } else {
98 break;
99 }
100 }
101 return baos.toByteArray();
102 }
103
104 private void writeReplacement(OutputStream os, String[] replacement) throws IOException {
105 for (String s : replacement) {
106 os.write(s.getBytes());
107 os.write(lineTerminator.getBytes());
108 }
109 }
110 }