/* Copyright (C) 2012 JabRef contributors.
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
package net.sf.jabref.imports.fetcher;
import java.io.IOException;
import java.io.InputStream;
import java.io.UnsupportedEncodingException;
import java.net.MalformedURLException;
import java.net.URL;
import java.net.URLConnection;
import java.net.URLEncoder;
import java.util.Scanner;
import javax.swing.JPanel;
import net.sf.jabref.BibtexEntry;
import net.sf.jabref.GUIGlobals;
import net.sf.jabref.Globals;
import net.sf.jabref.OutputPrinter;
import net.sf.jabref.imports.BibtexParser;
import net.sf.jabref.imports.CaseKeeper;
import net.sf.jabref.imports.EntryFetcher;
import net.sf.jabref.imports.ImportInspector;
/**
* This class uses Manas Tungare's ISBN to BibTeX Converter to convert an ISBN to a BibTeX entry <br />
* The online version of the converter is available at http://manas.tungare.name/software/isbn-to-bibtex/
*/
public class ISBNtoBibTeXFetcher implements EntryFetcher {
private static final String URL_PATTERN = "http://manas.tungare.name/software/isbn-to-bibtex/isbn-service?isbn=%s";
final CaseKeeper caseKeeper = new CaseKeeper();
@Override
public void stopFetching() {
// nothing needed as the fetching is a single HTTP GET
}
@Override
public boolean processQuery(String query, ImportInspector inspector, OutputPrinter status) {
String q;
try {
q = URLEncoder.encode(query, "UTF-8");
} catch (UnsupportedEncodingException e) {
// this should never happen
status.setStatus(Globals.lang("Error"));
e.printStackTrace();
return false;
}
String urlString = String.format(URL_PATTERN, q);
// Send the request
URL url;
URLConnection conn;
try {
url = new URL(urlString);
} catch (MalformedURLException e) {
e.printStackTrace();
return false;
} catch (IOException e) {
e.printStackTrace();
return false;
}
InputStream source;
try {
source = url.openStream();
} catch (IOException e) {
e.printStackTrace();
return false;
}
String bibtexString = new Scanner(source).useDelimiter("\\A").next();
if (bibtexString.startsWith("@comment")) {
// an error occured
// the error is nested in @comment{...}
String errorMsg = bibtexString.substring("@comment{".length());
errorMsg = errorMsg.substring(0, errorMsg.length()-1);
status.showMessage(errorMsg); // showMessage does not work -> NPE
return false;
}
BibtexEntry entry = BibtexParser.singleFromString(bibtexString);
if(entry != null) {
// Optionally add curly brackets around key words to keep the case
String title = (String)entry.getField("title");
if (title != null) {
if (Globals.prefs.getBoolean("useCaseKeeperOnSearch")) {
title = caseKeeper.format(title);
}
entry.setField("title", title);
}
inspector.addEntry(entry);
return true;
} else {
return false;
}
}
@Override
public String getTitle() {
return "ISBN to BibTeX";
}
@Override
public String getKeyName() {
return "ISBNtoBibTeX";
}
@Override
public URL getIcon() {
// no special icon for this fetcher available.
// Therefore, we return some kind of default icon
return GUIGlobals.getIconUrl("www");
}
@Override
public String getHelpPage() {
return "ISBNtoBibTeXHelp.html";
}
@Override
public JPanel getOptionsPanel() {
// no additional options available
return null;
}
}