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        // System.out.println("ba="+new String(buffer, "UTF-8"));
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        //System.out.println("Converting ["+file+"]");
49        writeConvertedBytesIntoFile(file, convertedBytes);
50        pl.onInplaceConversion(file);
51      } else {
52        //System.out.println("Not touching ["+file+"]");
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  }