1 package org.slf4j.migrator;
2
3 import java.io.BufferedReader;
4 import java.io.ByteArrayInputStream;
5 import java.io.ByteArrayOutputStream;
6 import java.io.File;
7 import java.io.FileInputStream;
8 import java.io.FileOutputStream;
9 import java.io.IOException;
10 import java.io.InputStreamReader;
11 import java.io.OutputStream;
12 import java.io.Reader;
13
14 import org.slf4j.migrator.internal.ProgressListener;
15 import org.slf4j.migrator.line.LineConverter;
16 import org.slf4j.migrator.line.RuleSet;
17
18 public class InplaceFileConverter {
19
20 final static int BUFFER_LEN = 8 * 1024;
21 final LineConverter lineConverter;
22 final String lineTerminator;
23 final ProgressListener pl;
24
25 InplaceFileConverter(RuleSet ruleSet, ProgressListener pl) {
26 this.lineConverter = new LineConverter(ruleSet);
27 lineTerminator = System.getProperty("line.separator");
28 this.pl = pl;
29 }
30
31 private byte[] readIntoByteArray(File file) throws IOException {
32 FileInputStream fis = new FileInputStream(file);
33 ByteArrayOutputStream baos = new ByteArrayOutputStream();
34 int n = 0;
35 byte[] buffer = new byte[BUFFER_LEN];
36 while ((n = fis.read(buffer)) != -1) {
37
38 baos.write(buffer, 0, n);
39 }
40 fis.close();
41 return baos.toByteArray();
42 }
43
44 void convert(File file) throws IOException {
45 byte[] originalBytes = readIntoByteArray(file);
46 byte[] convertedBytes = convertIntoTempByteArray(originalBytes);
47 if (lineConverter.atLeastOneMatchOccured()) {
48
49 writeConvertedBytesIntoFile(file, convertedBytes);
50 pl.onInplaceConversion(file);
51 } else {
52
53 }
54 }
55
56 private void writeConvertedBytesIntoFile(File file, byte[] convertedBytes) throws IOException {
57 FileOutputStream fos = new FileOutputStream(file);
58 fos.write(convertedBytes);
59 fos.flush();
60 fos.close();
61 }
62
63 private byte[] convertIntoTempByteArray(byte[] input) throws IOException {
64 ByteArrayInputStream bais = new ByteArrayInputStream(input);
65 Reader reader = new InputStreamReader(bais);
66 BufferedReader breader = new BufferedReader(reader);
67 ByteArrayOutputStream baos = new ByteArrayOutputStream();
68 while (true) {
69 String line = breader.readLine();
70 if (line != null) {
71 String[] replacement = lineConverter.getReplacement(line);
72 writeReplacement(baos, replacement);
73 } else {
74 break;
75 }
76 }
77 return baos.toByteArray();
78 }
79
80 private void writeReplacement(OutputStream os, String[] replacement)
81 throws IOException {
82 for (int i = 0; i < replacement.length; i++) {
83 os.write(replacement[i].getBytes());
84 os.write(lineTerminator.getBytes());
85 }
86 }
87 }