package jetbrains.mps.deepcompare; import jetbrains.mps.util.DifflibFacade; import java.io.*; import java.util.HashMap; import java.util.Map; /** * evgeny, 4/24/12 */ public class CompareStatus { private File reportDir; private Map<String, PrintWriter> writerMap = new HashMap<String, PrintWriter>(); public CompareStatus(File reportDir) { this.reportDir = new File(reportDir, "diffreports"); } public void report(String path, String message) { System.out.println(path + ": " + message); } public void reportDiff(String path, String expected, String actual) { if (expected.equals(actual)) return; String[] simpleDiff = DifflibFacade.getSimpleDiff(expected, actual); if(path.toLowerCase().endsWith("/module.xml")) { PrintWriter writer = stream("changes_in_module.xml"); writer.println("changes in " + path); writer.println("-----------------------"); for (String s : simpleDiff) { writer.println(s); } writer.println(); writer.println(); writer.println(); } else { PrintWriter writer = stream(path); for (String s : simpleDiff) { writer.println(s); } } } public PrintWriter stream(String streamId, String path) { int slash = path.indexOf("/"); if(slash == -1) { return stream(streamId); } int nextslash = path.indexOf('/', slash + 1); if(nextslash != -1) { slash = nextslash; } return stream(path.substring(0, slash) + "/" + streamId); } public PrintWriter stream(String streamId) { PrintWriter writer = writerMap.get(streamId); if (writer == null) { File file = new File(reportDir, streamId); if (!file.getParentFile().exists()) { file.getParentFile().mkdirs(); } if (file.exists()) { System.err.println("cannot create " + streamId); } else { try { file.createNewFile(); } catch (IOException ex) { System.err.println("cannot create stream " + streamId + ": " + ex.getMessage()); } } try { writer = new PrintWriter(new OutputStreamWriter(new FileOutputStream(file), "utf-8")); } catch (Exception ex) { System.err.println("cannot create writer " + streamId + ": " + ex.getMessage()); } if(writer == null) { writer = new PrintWriter(new StringWriter()); } writerMap.put(streamId, writer); } return writer; } public void init() { delete(reportDir); reportDir.mkdirs(); } public void done() { for (PrintWriter w : writerMap.values()) { try { w.close(); } catch (Exception e) { System.err.println("cannot close stream: " + e.getMessage()); } } writerMap = null; } public static boolean delete(File root) { boolean result = true; if (root.isDirectory()) { for (File child : root.listFiles()) { result = delete(child) && result; } } // !result means one of children was not deleted, hence you may not delete this directory return result && root.delete(); } }