package net.sf.jabref.imports; import java.io.File; import java.util.Collection; import java.util.HashMap; import java.util.logging.Logger; import net.sf.jabref.BibtexDatabase; import net.sf.jabref.BibtexEntry; import net.sf.jabref.GUIGlobals; import net.sf.jabref.JabRef; import net.sf.jabref.Util; import net.sf.jabref.gui.FileListEntry; import net.sf.jabref.gui.FileListTableModel; /** * Search class for files. <br> * <br> * This class provides some functionality to search in a {@link BibtexDatabase} for * files. <br> * <br> * * * @author Nosh&Dan * @version 09.11.2008 | 21:21:41 * */ public class DatabaseFileLookup { private static final String KEY_FILE_FIELD = "file"; private static Logger logger = Logger.getLogger(DatabaseFileLookup.class.getName()); private final HashMap<File, Boolean> fileToFound = new HashMap<File, Boolean>(); private final Collection<BibtexEntry> entries; private final String[] possibleFilePaths; /** * Creates an instance by passing a {@link BibtexDatabase} which will be * used for the searches. * * @param aDatabase * A {@link BibtexDatabase}. */ public DatabaseFileLookup(BibtexDatabase aDatabase) { if (aDatabase == null) throw new IllegalArgumentException("Passing a 'null' BibtexDatabase."); entries = aDatabase.getEntries(); possibleFilePaths = JabRef.jrf.basePanel().metaData().getFileDirectory(GUIGlobals.FILE_FIELD); } /** * Returns whether the File <code>aFile</code> is present in the database * as an attached File to an {@link BibtexEntry}. <br> * <br> * To do this, the field specified by the key <b>file</b> will be searched * for the provided file for every {@link BibtexEntry} in the database. <br> * <br> * For the matching, the absolute file paths will be used. * * @param file * A {@link File} Object. * @return <code>true</code>, if the file Object is stored in at least one * entry in the database, otherwise <code>false</code>. */ public boolean lookupDatabase(File aFile) { if (fileToFound.containsKey(aFile)) { return fileToFound.get(aFile); } else { Boolean res = false; for (BibtexEntry entry : entries) { if (lookupEntry(aFile, entry)) { res = true; break; } } fileToFound.put(aFile, res); //System.out.println(aFile); return res; } } /** * Searches the specified {@link BibtexEntry} <code>anEntry</code> for the * appearance of the specified {@link File} <code>aFile</code>. <br> * <br> * Therefore the <i>file</i>-field of the bibtex-entry will be searched for * the absolute filepath of the searched file. <br> * <br> * * @param aFile * A file that is searched in an bibtex-entry. * @param anEntry * A bibtex-entry, in which the file is searched. * @return <code>true</code>, if the bibtex entry stores the file in its * <i>file</i>-field, otherwise <code>false</code>. */ public boolean lookupEntry(File aFile, BibtexEntry anEntry) { if (aFile == null || anEntry == null) return false; FileListTableModel model = new FileListTableModel(); String fileField = anEntry.getField(KEY_FILE_FIELD); model.setContent(fileField); for (int i = 0; i < model.getRowCount(); i++) { FileListEntry flEntry = model.getEntry(i); String link = flEntry.getLink(); if (link == null) { break; } File expandedFilename = Util.expandFilename(link, possibleFilePaths); if (expandedFilename != null // file exists && expandedFilename.equals(aFile)) { return true; } } return false; } }