1   package org.slf4j.converter;
2   
3   import java.io.File;
4   import java.io.FileInputStream;
5   import java.io.FileOutputStream;
6   import java.io.FileNotFoundException;
7   import java.io.IOException;
8   import java.io.FileReader;
9   import java.io.BufferedReader;
10  import java.io.InputStreamReader;
11  import java.nio.channels.FileChannel;
12  import java.util.Iterator;
13  import java.util.List;
14  import java.util.ArrayList;
15  
16  import javax.swing.JFileChooser;
17  
18  public class Converter {
19  
20  	private List<File> javaFiles;
21  
22  	private AbstractMatcher matcher;
23  
24  	private Writer writer;
25  
26  	private String source;
27  
28  	private int conversionType;
29  
30  	private boolean commentConversion;
31  
32  	/**
33  	 * @param args
34  	 * @throws IOException 
35  	 * @throws IOException
36  	 */
37  	public static void main(String[] args) throws IOException {
38  
39  		Converter converter = new Converter();
40  
41  		if (args.length > 0) {
42  			converter.source = args[0];
43  		} else {
44  			// converter.source = new File("").getAbsolutePath();
45  			JFileChooser selector = new JFileChooser();
46  			selector.setDialogTitle("Source folder selector");
47  			selector.setFileSelectionMode(JFileChooser.DIRECTORIES_ONLY);
48  			int res = selector.showOpenDialog(null);
49  			if (res == JFileChooser.APPROVE_OPTION) {
50  				File folder = selector.getSelectedFile();
51  				converter.source = folder.getAbsolutePath();
52  			} else {
53  				return;
54  			}
55  		}
56  
57  		converter.conversionType = Constant.JCL_TO_SLF4J;
58  		if (converter.init()) {
59  			converter.convert(converter.javaFiles);
60  		}
61  	}
62  
63  	/**
64  	 * 
65  	 * @return
66  	 * @throws IOException
67  	 */
68  	public boolean init() throws IOException {
69  		matcher = AbstractMatcher.getMatcherImpl(conversionType);
70  		if (matcher == null) {
71  			return false;
72  		}
73  		matcher.setCommentConversion(commentConversion);
74  		writer = new Writer();
75  
76  		File fileSource = new File(source);
77  		if (!fileSource.isDirectory()) {
78  			System.out.println("source path is not a valid source directory");
79  			return false;
80  		} else {
81  			BufferedReader in = new BufferedReader(new InputStreamReader(
82  					System.in));
83  			System.out
84  					.println("RUNNING CONVERTER WILL REPLACE JAVA FILES CONTAINED IN "
85  							+ source + ", DO YOU WANT TO CONTINUE Y / N ?");
86  			String response = in.readLine();
87  			if (response.equalsIgnoreCase("N")) {
88  				return false;
89  			}
90  
91  			selectFiles(fileSource);
92  
93  			if (javaFiles.size() > 1000) {
94  				System.out.println("THERE IS " + javaFiles.size()
95  						+ " FILES TO CONVERT, DO YOU WANT TO CONTINUE Y / N ?");
96  				if (response.equalsIgnoreCase("N")) {
97  					return false;
98  				}
99  			}
100 		}
101 		return true;
102 	}
103 
104 	/**
105 	 * 
106 	 * @param fdest
107 	 */
108 	private void delete(File fdest) {
109 		if (fdest.isDirectory()) {
110 			File[] files = fdest.listFiles();
111 			if (files != null) {
112 				for (int i = 0; i < files.length; i++) {
113 					delete(files[i]);
114 				}
115 			}
116 			fdest.delete();
117 		} else {
118 			fdest.delete();
119 		}
120 	}
121 
122 	/**
123 	 * 
124 	 * @param fsource
125 	 * @param fdest
126 	 */
127 	private void copy(File fsource, File fdest) {
128 		try {
129 			FileInputStream fis = new FileInputStream(fsource);
130 			FileOutputStream fos = new FileOutputStream(fdest);
131 			FileChannel channelSource = fis.getChannel();
132 			FileChannel channelDest = fos.getChannel();
133 			if (channelSource.isOpen() && channelDest.isOpen()) {
134 				channelSource.transferTo(0, channelSource.size(), channelDest);
135 				channelSource.close();
136 				channelDest.close();
137 			} else {
138 				System.out.println("error copying file "
139 						+ fsource.getAbsolutePath());
140 			}
141 
142 		} catch (FileNotFoundException exc) {
143 			System.out.println(exc.toString());
144 		} catch (IOException e) {
145 			System.out.println(e.toString());
146 		}
147 	}
148 
149 	/**
150 	 * 
151 	 * @param file
152 	 * @return
153 	 */
154 	private List<File> selectFiles(File file) {
155 		if (javaFiles == null) {
156 			javaFiles = new ArrayList<File>();
157 		}
158 		if (file.isDirectory()) {
159 			File[] files = file.listFiles();
160 			if (files != null) {
161 				for (int i = 0; i < files.length; i++) {
162 					selectFiles(files[i]);
163 				}
164 			}
165 		} else {
166 			if (file.getName().endsWith(".java")) {
167 				javaFiles.add(file);
168 			}
169 		}
170 		return javaFiles;
171 	}
172 
173 	/**
174 	 * 
175 	 * @param lstFiles
176 	 */
177 	private void convert(List<File> lstFiles) {
178 		Iterator<File> itFile = lstFiles.iterator();
179 		while (itFile.hasNext()) {
180 			File currentFile = itFile.next();
181 			convert(currentFile);
182 		}
183 	}
184 
185 	/**
186 	 * 
187 	 * @param file
188 	 */
189 	private void convert(File file) {
190 		File newFile = new File(file.getAbsolutePath() + "new");
191 		try {
192 			boolean isEmpty = false;
193 			writer.initFileWriter(newFile);
194 			FileReader freader = new FileReader(file);
195 			BufferedReader breader = new BufferedReader(freader);
196 			String line;
197 			String newLine;
198 			while (!isEmpty) {
199 				line = breader.readLine();
200 				if (line != null) {
201 					newLine = matcher.replace(line);
202 					writer.write(newLine);
203 				} else {
204 					isEmpty = true;
205 					writer.closeFileWriter();
206 					copy(newFile, file);
207 					delete(newFile);
208 				}
209 			}
210 		} catch (IOException exc) {
211 			System.out.println("error reading file " + exc);
212 		}
213 	}
214 }