package mandelbrot.dependency.analyzer;
import java.util.Comparator;
import java.util.List;
import java.util.Map.Entry;
import java.util.Set;
import mandelbrot.dependency.data.ModuleDescriptor;
import com.google.common.base.Objects;
import com.google.common.base.Optional;
import com.google.common.base.Preconditions;
import com.google.common.collect.ImmutableCollection;
import com.google.common.collect.ImmutableList;
import com.google.common.collect.ImmutableMultimap;
import com.google.common.collect.ImmutableMultimap.Builder;
import com.google.common.collect.SortedSetMultimap;
// TODO Unused..found another algorithm which just iterates in order and inserts into an immultible multimap builder
// as it sees each package name / module descriptor entry.
public class PackageComparator implements Comparator<String> {
private final ImmutableMultimap<String, ModuleDescriptor> modulesByPackageName;
public PackageComparator(final SortedSetMultimap<String, ModuleDescriptor> resolvedModuleDependencies) {
this.resolvedModuleDependencies = Preconditions.checkNotNull(resolvedModuleDependencies);
final Set<Entry<String,ModuleDescriptor>> entries = resolvedModuleDependencies.entries();
final Builder<String, ModuleDescriptor> builder = ImmutableMultimap.builder();
for (final Entry<String, ModuleDescriptor> entry : entries) {
final String javaPackageName = entry.getValue().getJavaPackageName();
builder.put(javaPackageName, entry.getValue());
}
this.modulesByPackageName = builder.build();
}
public ImmutableMultimap<String, ModuleDescriptor> getModulesByPackageName() {
return modulesByPackageName;
}
final SortedSetMultimap<String, ModuleDescriptor> resolvedModuleDependencies;
@Override
public int compare(final String arg0, final String arg1) {
if (Objects.equal(arg0, arg1))
return 0;
final ImmutableCollection<ModuleDescriptor> immutableCollection = modulesByPackageName.get(arg0);
final ImmutableCollection<ModuleDescriptor> immutableCollection2 = modulesByPackageName.get(arg1);
for (final ModuleDescriptor moduleDescriptor : immutableCollection) {
for (final ModuleDescriptor moduleDescriptor2 : immutableCollection2) {
final int cmp = dependencyCompare(moduleDescriptor, moduleDescriptor2);
if (cmp != 0)
return cmp;
}
}
return nullSafeStringCompare(arg0, arg1);
}
private int nullSafeStringCompare(final String arg0, final String arg1) {
return Optional.fromNullable(arg0).or("").compareTo(Optional.fromNullable(arg1).or(""));
}
private int dependencyCompare(final ModuleDescriptor moduleDescriptor,
final ModuleDescriptor moduleDescriptor2) {
if (Objects.equal(moduleDescriptor, moduleDescriptor2))
return 0;
final List<String> orderedModules = ImmutableList.copyOf(resolvedModuleDependencies.keySet());
for (final String module : orderedModules) {
if (moduleDescriptor.nameEquals(module)) {
return -1;
}
if (moduleDescriptor2.nameEquals(module)) {
return 1;
}
}
return nullSafeStringCompare(moduleDescriptor.getModuleName(), moduleDescriptor2.getModuleName());
}
}