how to use java-diff-utils
Hello,
for a test, I need to compare files in a groovy script and I found out that a library could help me perform this in a simple way. However, though there are quite a lot of examples that I can rely on in order to build my own methods, I am unable to use this lib. I cannot find anywhere how to import / use this lib in my groovy script.
I set the java-diff-utils-2.2.0.jar and jsr305-3.0.0.jar in bin/ext and I use the following example in a groovy step, just for trying, but it fails (unable to resolve class Patch @ line 70, column 19)
I guess that import is wrong, but I'm not fluent in groovy/java and not familiar at all with dependency and lib handling
Could anyone help me figure out what's wrong ?
import difflib.*;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileReader;
import java.io.IOException;
import java.net.URL;
import java.util.AbstractList;
import java.util.LinkedList;
import java.util.List;
public class TestDiffUtils {
public TestDiffUtils() {
}
// Helper method to read the files to compare into memory, convert them to a list of Strings which can be used by the DiffUtils library for comparison
private static List fileToLines(String filename) {
List lines = new LinkedList();
String line;
try {
URL path = TestDiffUtils.class.getResource(filename);
File f = new File(path.getFile());
BufferedReader input = new BufferedReader(new FileReader(f));
while ((line = input.readLine()) != null) {
lines.add(line);
}
} catch (IOException e) {
e.printStackTrace();
}
return lines;
}
// Helper method to convert a String to List<Character> : to be used with DiffUtils.diff() method when finding character diffs within the line diffs
public static List<Character> asList(final String string) {
return new AbstractList<Character>() {
public int size() { return string.length(); }
public Character get(int index) { return string.charAt(index); }
};
}
private static void performDiff(String testName) {
String origFileName = null;
String revisedFileName = null;
Boolean continueTest = true; // continue unless we can't
if( testName.compareTo("large-file-test") == 0 )
{
origFileName = "test_large_file.xml";
revisedFileName = "test_large_file_revised.xml";
}else if( testName.compareTo("small-file-test") == 0 ){
origFileName = "originalFile.txt";
revisedFileName = "revisedFile.txt";
}else if( testName.compareTo("large-file-test-single-line") == 0 ){
origFileName = "test_large_file_SingleLine.xml";
revisedFileName = "test_large_file_revised_SingleLine.xml";
}else{
continueTest = false;
}
if( continueTest && origFileName != null && revisedFileName != null ) {
// Convert the orig and revised files to List<String> format that DiffUtils.diff() uses
List<String> originalLines = fileToLines(origFileName);
List<String> revisedLines = fileToLines(revisedFileName);
// Get the line-by-line diffs
Patch patch = DiffUtils.diff(originalLines, revisedLines);
List<Delta> deltas = patch.getDeltas();
for (Delta delta : deltas) {
// The line in the orig file that this current diff occurs at
int lineOfDiffInOrig = delta.getOriginal().getPosition() + 1;
// Only continue with the diff if the revised lines is not empty (we will get IndexOu0tOfBoundsExceptions if we don't do this check)
if (delta.getOriginal().getLines().size() > 0 && delta.getRevised().getLines().size() > 0) {
// Get orig and revised lines in List<Character> format
List<Character> origChars = asList(((String) delta.getOriginal().getLines().get(0)));
List<Character> revisedChars = asList(((String) delta.getRevised().getLines().get(0)));
// Get the character-by-character diffs
Patch deltaPatch = DiffUtils.diff(origChars, revisedChars);
List<Delta> strDeltas = deltaPatch.getDeltas();
for (Delta strDelta : strDeltas) {
int charPosOfDiffInOrig = strDelta.getOriginal().getPosition() + 1;
int lengthOfDiffInOrig = charPosOfDiffInOrig + strDelta.getOriginal().size();
System.out.println("Line" + lineOfDiffInOrig + " : [" + charPosOfDiffInOrig + "," + lengthOfDiffInOrig + "]");
}
}
}
}
}
public static void main(String[] args) {
//performDiff("large-file-test");
//performDiff("small-file-test");
performDiff("large-file-test-single-line");
}
}thanks for any help
Alex
Hi krogold, thank’s for creating this topic.
This article contains an example of using third-party libraries in ReadyAPI, perhaps, you will find this helpful.