package net.sf.jabref.external;
import net.sf.jabref.*;
import net.sf.jabref.undo.UndoableFieldChange;
import net.sf.jabref.gui.FileListEntry;
import net.sf.jabref.gui.FileListTableModel;
import javax.swing.*;
import java.io.IOException;
/**
* Try to download fulltext PDF for selected entry(ies) by following URL or DOI link.
*/
public class FindFullTextAction extends AbstractWorker {
private BasePanel basePanel;
private BibtexEntry entry = null;
private FindFullText.FindResult result = null;
public FindFullTextAction(BasePanel basePanel) {
this.basePanel = basePanel;
}
public void init() throws Throwable {
basePanel.output(Globals.lang("Looking for full text document..."));
}
public void run() {
entry = basePanel.getSelectedEntries()[0];
FindFullText fft = new FindFullText();
result = fft.findFullText(entry);
}
public void update() {
//pdfURL = new URL("http://geog-www.sbs.ohio-state.edu/faculty/bmark/abbott_etal_ppp03.pdf");
if (result.url != null) {
//System.out.println("PDF URL: "+result.url);
String bibtexKey = entry.getCiteKey();
String fileDir = basePanel.metaData().getFileDirectory(GUIGlobals.FILE_FIELD);
if (fileDir == null) {
// TODO: error message if file dir not defined
//JOptionPane.showMessageDialog(frame, Globals.lang);
return;
}
DownloadExternalFile def = new DownloadExternalFile(basePanel.frame(), basePanel.metaData(),
bibtexKey);
try {
def.download(result.url, new DownloadExternalFile.DownloadCallback() {
public void downloadComplete(FileListEntry file) {
System.out.println("finished");
FileListTableModel tm = new FileListTableModel();
String oldValue = entry.getField(GUIGlobals.FILE_FIELD);
tm.setContent(oldValue);
tm.addEntry(tm.getRowCount(), file);
String newValue = tm.getStringRepresentation();
UndoableFieldChange edit = new UndoableFieldChange(entry,
GUIGlobals.FILE_FIELD, oldValue, newValue);
entry.setField(GUIGlobals.FILE_FIELD, newValue);
basePanel.undoManager.addEdit(edit);
basePanel.markBaseChanged();
}
});
} catch (IOException e) {
e.printStackTrace();
}
basePanel.output(Globals.lang("Finished downloading full text document"));
}
else {
String message = null;
switch (result.status) {
case FindFullText.UNKNOWN_DOMAIN:
message = Globals.lang("Unable to find full text article. No search algorithm "
+"defined for the '%0' web site.", result.host);
break;
case FindFullText.WRONG_MIME_TYPE:
message = Globals.lang("Found pdf link, but received the wrong MIME type. "
+"This could indicate that you don't have access to the fulltext article.");
break;
case FindFullText.LINK_NOT_FOUND:
message = Globals.lang("Unable to find full text document in the linked web page.");
break;
case FindFullText.IO_EXCEPTION:
message = Globals.lang("Connection error when trying to find full text document.");
break;
case FindFullText.NO_URLS_DEFINED:
message = Globals.lang("This entry provides no URL or DOI links.");
break;
}
basePanel.output(Globals.lang("Full text article download failed"));
JOptionPane.showMessageDialog(basePanel.frame(), message, Globals.lang("Full text article download failed"),
JOptionPane.ERROR_MESSAGE);
}
}
}