All Downloads are FREE. Search and download functionalities are using the official Maven repository.

net.sf.javagimmicks.io.folderdiff.FileInfoComparatorBuilder Maven / Gradle / Ivy

package net.sf.javagimmicks.io.folderdiff;

import java.util.ArrayList;
import java.util.Comparator;
import java.util.List;

import net.sf.javagimmicks.collections.ListComparator;
import net.sf.javagimmicks.math.NumberCompareUtils;
import net.sf.javagimmicks.math.comparator.LongComparator;
import net.sf.javagimmicks.util.CompositeComparator;

@SuppressWarnings("unchecked")
class FileInfoComparatorBuilder
{
   private boolean _comparePaths = true;
   private boolean _compareSize = false;
   private boolean _compareLastModified = false;
   private boolean _compareChecksum = false;

   private FolderDiffListener _listener;
   
   public static Comparator getPathOnlyInstance()
   {
      return new FileInfoComparatorBuilder().buildComparator();
   }
   
   public static Comparator getPathAndSizeInstance()
   {
      return new FileInfoComparatorBuilder().setCompareSize(true).buildComparator();
   }
   
   public static Comparator getPathAndLastModifiedInstance()
   {
      return new FileInfoComparatorBuilder().setCompareLastModified(true).buildComparator();
   }
   
   public static Comparator getPathAndSizeAndLastModifiedInstance()
   {
      return new FileInfoComparatorBuilder().setCompareLastModified(true).setCompareSize(true)
         .buildComparator();
   }
   
   public Comparator buildComparator()
   {
      List> comparators = new ArrayList>();
      
      if(_compareSize)
      {
         comparators.add(SIZE_COMPARATOR);
      }
      
      if(_compareLastModified)
      {
         comparators.add(LAST_MOD_COMPARATOR);
      }
      
      if(_comparePaths)
      {
         comparators.add(PATH_COMPARATOR);
      }
      
      if(_compareChecksum)
      {
         comparators.add(CHECKSUM_COMPARATOR);
      }
      
      Comparator actualComparator = new CompositeComparator(comparators);
      return _listener == null ? actualComparator : new EventFileInfoComparator(actualComparator, _listener);      
   }
   
   private static final class EventFileInfoComparator implements Comparator
   {
      private final Comparator _baseComparator;
      private final FolderDiffListener _listener;
      
      public EventFileInfoComparator(Comparator comparator, FolderDiffListener listener)
      {
         _baseComparator = comparator;
         _listener = listener;
      }

      public int compare(FileInfo o1, FileInfo o2)
      {
         _listener.fileInfosCompared(o1, o2);
         
         return _baseComparator.compare(o1, o2);
      }
   }
   
   public void setFolderDiffListener(FolderDiffListener listener)
   {
      _listener = listener;
   }
   
   public boolean isComparePaths()
   {
      return _comparePaths;
   }
   
   public boolean isCompareSize()
   {
      return _compareSize;
   }
   
   public boolean isCompareLastModified()
   {
      return _compareLastModified;
   }
   
   public boolean isCompareChecksum()
   {
      return _compareChecksum;
   }

   public FileInfoComparatorBuilder setComparePaths(boolean comparePaths)
   {
      _comparePaths = comparePaths;
      
      return this;
   }
   
   public FileInfoComparatorBuilder setCompareSize(boolean compareSize)
   {
      _compareSize = compareSize;
      
      return this;
   }
   
   public FileInfoComparatorBuilder setCompareLastModified(boolean compareLastModified)
   {
      _compareLastModified = compareLastModified;
      
      return this;
   }

   public void setCompareChecksum(boolean compareChecksum)
   {
      _compareChecksum = compareChecksum;
   }

   private static final LongComparator LONG_COMPARATOR = NumberCompareUtils.getLongComparator(); 
   private static final ListComparator STRING_LIST_COMPARATOR;

   static
   {
      final ListComparator c = (ListComparator) ListComparator.COMPARABLE_INSTANCE;
      STRING_LIST_COMPARATOR = c;
   }
   
   public static final Comparator CHECKSUM_COMPARATOR = new Comparator()
   {
      public int compare(FileInfo o1, FileInfo o2)
      {
         return LONG_COMPARATOR.compare(o1.getChecksum(), o2.getChecksum());
      }
   };

   public static final Comparator LAST_MOD_COMPARATOR = new Comparator()
   {
      public int compare(FileInfo o1, FileInfo o2)
      {
         if(o1.isDirectory() && o2.isDirectory())
         {
            return 0;
         }
         else if(o1.isDirectory())
         {
            return -1;
         }
         else if(o2.isDirectory())
         {
            return 1;
         }
         
         return LONG_COMPARATOR.compare(o1.getLastModified(), o2.getLastModified());
      }
   };
   
   public static final Comparator SIZE_COMPARATOR = new Comparator()
   {
      public int compare(FileInfo o1, FileInfo o2)
      {
         return LONG_COMPARATOR.compare(o1.getSize(), o2.getSize());
      }
   };
   
   public static final Comparator PATH_INFO_COMPARATOR = new Comparator()
   {
      public int compare(PathInfo o1, PathInfo o2)
      {
         List pathFragments1 = o1.getPathFragments();
         List pathFragments2 = o2.getPathFragments();
         
         int size1 = pathFragments1.size();
         int size2 = pathFragments2.size();

         if(size1 == 0 && size2 == 0)
         {
            return 0;
         }
         else if(size1 == 0)
         {
            return -1;
         }
         else if(size2 == 0)
         {
            return 1;
         }
         
         List parentPath1 = pathFragments1.subList(0, size1 - 1);
         List parentPath2 = pathFragments2.subList(0, size2 - 1);
         
         int parentCompare = STRING_LIST_COMPARATOR.compare(parentPath1, parentPath2);
         
         if(parentCompare != 0)
         {
            return parentCompare;
         }
         
         boolean isDirectory1 = o1.isDirectory();
         if(isDirectory1 != o2.isDirectory())
         {
            return isDirectory1 ? -1 : 1;
         }
         
         return pathFragments1.get(size1 - 1).compareTo(pathFragments2.get(size2 - 1));
      }
   };
   
   public static final Comparator PATH_COMPARATOR = new Comparator()
   {
      public int compare(FileInfo o1, FileInfo o2)
      {
         return PATH_INFO_COMPARATOR.compare(o1.getPathInfo(), o2.getPathInfo());
      }
   };
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy