2016-12-07 10:42:01 +00:00
|
|
|
package com.bytezone.diskbrowser.duplicates;
|
|
|
|
|
2016-12-12 07:43:19 +00:00
|
|
|
import java.awt.Dimension;
|
2016-12-11 21:32:18 +00:00
|
|
|
import java.awt.Graphics;
|
2016-12-07 10:42:01 +00:00
|
|
|
import java.io.File;
|
2016-12-11 05:18:04 +00:00
|
|
|
import java.util.List;
|
2016-12-07 10:42:01 +00:00
|
|
|
|
2016-12-11 21:32:18 +00:00
|
|
|
import javax.swing.JDialog;
|
|
|
|
import javax.swing.JPanel;
|
2016-12-11 05:18:04 +00:00
|
|
|
import javax.swing.SwingWorker;
|
|
|
|
|
2016-12-07 10:42:01 +00:00
|
|
|
import com.bytezone.diskbrowser.utilities.Utility;
|
|
|
|
|
2016-12-12 08:31:58 +00:00
|
|
|
public class DuplicateSwingWorker extends SwingWorker<Void, ProgressState>
|
2016-12-07 10:42:01 +00:00
|
|
|
{
|
|
|
|
private final File rootFolder;
|
2016-12-09 11:31:03 +00:00
|
|
|
private final int rootFolderNameLength;
|
2016-12-12 10:53:28 +00:00
|
|
|
// private final ProgressState progressState = new ProgressState ();
|
2016-12-11 21:32:18 +00:00
|
|
|
private final DuplicateWindow owner;
|
|
|
|
private final JDialog dialog;
|
|
|
|
private final ProgressPanel progressPanel;
|
2016-12-12 07:43:19 +00:00
|
|
|
private final boolean doChecksums;
|
2016-12-12 08:31:58 +00:00
|
|
|
private final RootFolderData rootFolderData;
|
2016-12-07 10:42:01 +00:00
|
|
|
|
2016-12-12 10:53:28 +00:00
|
|
|
public DuplicateSwingWorker (File rootFolder, DuplicateWindow owner,
|
|
|
|
boolean doChecksums)
|
2016-12-07 10:42:01 +00:00
|
|
|
{
|
|
|
|
this.rootFolder = rootFolder;
|
2016-12-11 05:18:04 +00:00
|
|
|
this.owner = owner;
|
2016-12-12 07:43:19 +00:00
|
|
|
this.doChecksums = doChecksums;
|
2016-12-09 11:31:03 +00:00
|
|
|
rootFolderNameLength = rootFolder.getAbsolutePath ().length ();
|
2016-12-11 21:32:18 +00:00
|
|
|
|
2016-12-12 08:31:58 +00:00
|
|
|
rootFolderData = new RootFolderData ();
|
|
|
|
|
2016-12-11 21:32:18 +00:00
|
|
|
dialog = new JDialog (owner);
|
|
|
|
progressPanel = new ProgressPanel ();
|
2016-12-12 07:43:19 +00:00
|
|
|
progressPanel.setPreferredSize (new Dimension (485, 300));
|
2016-12-11 21:32:18 +00:00
|
|
|
dialog.add (progressPanel);
|
|
|
|
dialog.setTitle ("Reading disks");
|
2016-12-12 07:43:19 +00:00
|
|
|
dialog.pack ();
|
|
|
|
dialog.setLocationRelativeTo (null);
|
2016-12-11 21:32:18 +00:00
|
|
|
dialog.setVisible (true);
|
2016-12-09 11:31:03 +00:00
|
|
|
}
|
2016-12-08 01:19:18 +00:00
|
|
|
|
2016-12-09 11:31:03 +00:00
|
|
|
File getRootFolder ()
|
|
|
|
{
|
|
|
|
return rootFolder;
|
|
|
|
}
|
|
|
|
|
2016-12-08 01:19:18 +00:00
|
|
|
private void traverse (File directory)
|
2016-12-07 10:42:01 +00:00
|
|
|
{
|
|
|
|
File[] files = directory.listFiles ();
|
2016-12-09 11:31:03 +00:00
|
|
|
|
2016-12-07 10:42:01 +00:00
|
|
|
if (files == null || files.length == 0)
|
|
|
|
{
|
|
|
|
System.out.println ("Empty folder : " + directory.getAbsolutePath ());
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
|
|
|
for (File file : files)
|
|
|
|
{
|
2016-12-09 11:31:03 +00:00
|
|
|
String fileName = file.getName ().toLowerCase ();
|
|
|
|
|
2016-12-07 10:42:01 +00:00
|
|
|
if (file.isDirectory ())
|
|
|
|
{
|
2016-12-12 10:53:28 +00:00
|
|
|
rootFolderData.progressState.incrementFolders ();
|
2016-12-08 01:19:18 +00:00
|
|
|
traverse (file);
|
2016-12-07 10:42:01 +00:00
|
|
|
}
|
2016-12-11 05:18:04 +00:00
|
|
|
else if (Utility.validFileType (fileName) && file.length () > 0)
|
2016-12-07 10:42:01 +00:00
|
|
|
{
|
2016-12-12 10:53:28 +00:00
|
|
|
rootFolderData.progressState.incrementType (file, fileName);
|
2016-12-09 11:31:03 +00:00
|
|
|
checkDuplicates (file, fileName);
|
2016-12-11 05:18:04 +00:00
|
|
|
|
2016-12-12 10:53:28 +00:00
|
|
|
if ((rootFolderData.progressState.totalDisks % 500) == 0)
|
|
|
|
publish (rootFolderData.progressState);
|
2016-12-07 10:42:01 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2016-12-11 05:18:04 +00:00
|
|
|
private void checkDuplicates (File file, String filename)
|
2016-12-07 10:42:01 +00:00
|
|
|
{
|
2016-12-09 11:31:03 +00:00
|
|
|
String rootName = file.getAbsolutePath ().substring (rootFolderNameLength);
|
2016-12-12 07:43:19 +00:00
|
|
|
DiskDetails diskDetails = new DiskDetails (file, rootName, filename, doChecksums);
|
2016-12-07 10:42:01 +00:00
|
|
|
|
2016-12-12 08:31:58 +00:00
|
|
|
if (rootFolderData.fileNameMap.containsKey (filename))
|
|
|
|
rootFolderData.fileNameMap.get (filename).addDuplicateName (diskDetails);
|
2016-12-09 11:31:03 +00:00
|
|
|
else
|
2016-12-12 08:31:58 +00:00
|
|
|
rootFolderData.fileNameMap.put (filename, diskDetails);
|
2016-12-07 10:42:01 +00:00
|
|
|
|
2016-12-12 07:43:19 +00:00
|
|
|
if (doChecksums)
|
|
|
|
{
|
|
|
|
long checksum = diskDetails.getChecksum ();
|
2016-12-12 08:31:58 +00:00
|
|
|
if (rootFolderData.checksumMap.containsKey (checksum))
|
|
|
|
rootFolderData.checksumMap.get (checksum).addDuplicateChecksum (diskDetails);
|
2016-12-12 07:43:19 +00:00
|
|
|
else
|
2016-12-12 08:31:58 +00:00
|
|
|
rootFolderData.checksumMap.put (checksum, diskDetails);
|
2016-12-12 07:43:19 +00:00
|
|
|
}
|
2016-12-07 10:42:01 +00:00
|
|
|
}
|
|
|
|
|
2016-12-11 05:18:04 +00:00
|
|
|
@Override
|
|
|
|
protected void done ()
|
2016-12-07 10:42:01 +00:00
|
|
|
{
|
2016-12-11 05:18:04 +00:00
|
|
|
try
|
2016-12-07 10:42:01 +00:00
|
|
|
{
|
2016-12-11 21:32:18 +00:00
|
|
|
dialog.setVisible (false);
|
2016-12-12 10:53:28 +00:00
|
|
|
owner.setTableData (rootFolderData);
|
2016-12-11 05:18:04 +00:00
|
|
|
}
|
|
|
|
catch (Exception e)
|
|
|
|
{
|
|
|
|
e.printStackTrace ();
|
2016-12-07 10:42:01 +00:00
|
|
|
}
|
|
|
|
}
|
2016-12-11 05:18:04 +00:00
|
|
|
|
|
|
|
@Override
|
|
|
|
protected Void doInBackground () throws Exception
|
|
|
|
{
|
|
|
|
traverse (rootFolder);
|
2016-12-12 10:53:28 +00:00
|
|
|
rootFolderData.progressState.print ();
|
2016-12-11 05:18:04 +00:00
|
|
|
return null;
|
|
|
|
}
|
|
|
|
|
|
|
|
@Override
|
|
|
|
protected void process (List<ProgressState> chunks)
|
|
|
|
{
|
2016-12-11 21:32:18 +00:00
|
|
|
progressPanel.repaint ();
|
|
|
|
}
|
|
|
|
|
|
|
|
class ProgressPanel extends JPanel
|
|
|
|
{
|
|
|
|
@Override
|
|
|
|
protected void paintComponent (Graphics graphics)
|
|
|
|
{
|
|
|
|
super.paintComponent (graphics);
|
2016-12-12 10:53:28 +00:00
|
|
|
rootFolderData.progressState.paintComponent (graphics);
|
2016-12-11 21:32:18 +00:00
|
|
|
}
|
2016-12-11 05:18:04 +00:00
|
|
|
}
|
2016-12-07 10:42:01 +00:00
|
|
|
}
|