/*
* StrictDuplicateSearch.java
*
* Created on November 4, 2004, 11:59 PM
*/
package net.sf.jabref;
import java.util.HashSet;
import java.util.Iterator;
import javax.swing.JOptionPane;
import javax.swing.SwingUtilities;
import net.sf.jabref.undo.NamedCompound;
import net.sf.jabref.undo.UndoableRemoveEntry;
/**
*
* @author alver
*/
public class StrictDuplicateSearch extends Thread {
BasePanel panel;
/** Creates a new instance of StrictDuplicateSearch */
public StrictDuplicateSearch(BasePanel bp) {
this.panel = bp;
}
public void run() {
HashSet<BibtexEntry> toRemove = new HashSet<BibtexEntry>();
NamedCompound ce = new NamedCompound(Globals.lang("Remove duplicates"));
panel.output(Globals.lang("Searching for duplicates..."));
Object[] keys = panel.database.getKeySet().toArray();
if ((keys == null) || (keys.length < 2))
return;
BibtexEntry[] bes = new BibtexEntry[keys.length];
for (int i=0; i<keys.length; i++)
bes[i] = panel.database.getEntryById((String)keys[i]);
for (int i = 0; i<bes.length-1; i++) {
for (int j = i + 1; j<bes.length; j++) {
// We only check the entries if none of the two are already marked for removal.
if (!toRemove.contains(bes[i]) && !toRemove.contains(bes[j]) &&
DuplicateCheck.compareEntriesStrictly(bes[i], bes[j]) > 1) {
// These two entries are exactly the same, so we can remove one.
if (!toRemove.contains(bes[i]) && !toRemove.contains(bes[j])) {
toRemove.add(bes[j]);
}
}
}
}
if (toRemove.size() == 0) {
panel.output(Globals.lang("No duplicates found")+".");
return;
}
// Finished searching. Now, remove all entries scheduled for removal:
int answer = JOptionPane.showConfirmDialog(panel.frame(), Globals.lang("Duplicates found")+": "+
toRemove.size()+". "+Globals.lang("Remove all?"), Globals.lang("Remove duplicates"),
JOptionPane.OK_CANCEL_OPTION);
if (answer == JOptionPane.CANCEL_OPTION)
return;
panel.output(Globals.lang("Duplicates removed")+": "+toRemove.size());
for (Iterator<BibtexEntry> i=toRemove.iterator(); i.hasNext();) {
BibtexEntry entry = i.next();
panel.database.removeEntry(entry.getId());
ce.addEdit(new UndoableRemoveEntry(panel.database, entry, panel));
}
ce.end();
panel.undoManager.addEdit(ce);
SwingUtilities.invokeLater(new Runnable() {
public void run() {
panel.markBaseChanged();
}
});
}
}