package org.jboss.windup.graph.model.comparator;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.util.Comparator;
import org.jboss.windup.util.ExecutionStatistics;
/**
* Sorts file paths according to their alphabetical order.
*
* For example:
* <ul>
* <li>/foo/bar/baz.class</li>
* <li>/foo/car/caz.class</li>
* <li>/foo/hat.class</li>
* </ul>
*
* Would become:
* <ul>
* <li>/foo/hat.class</li>
* <li>/foo/bar/baz.class</li>
* <li>/foo/car/caz.class</li>
* </ul>
*
* @author <a href="mailto:jesse.sightler@gmail.com">Jesse Sightler</a>
*
*/
public class FilePathComparator implements Comparator<String>
{
@Override
public int compare(String o1, String o2)
{
ExecutionStatistics.get().begin("FilePathComparator");
try
{
// if they are exactly the same, just short circuit everything
// and return 0
if (o1.equals(o2))
{
return 0;
}
// split by the path separator (/ or \)
Path path1 = Paths.get(o1);
Path path2 = Paths.get(o2);
if (path1.getNameCount() != path2.getNameCount())
{
// if there are differing number of path elements, compare based on number of segments
return path1.getNameCount() - path2.getNameCount();
}
else
{
// otherwise, compare each segment
for (int i = 0; i < path1.getNameCount(); i++)
{
String o1Segment = path1.getName(i).toString();
String o2Segment = path2.getName(i).toString();
// if the segments are different, return the results of this comparison
if (!o1Segment.equals(o2Segment))
{
return o1Segment.compareTo(o2Segment);
}
}
// no segments differed, so just return 0 (same path)
return 0;
}
}
finally
{
ExecutionStatistics.get().end("FilePathComparator");
}
}
}