package org.jabref.gui.importer.fetcher; import java.io.IOException; import java.net.URLEncoder; import javax.swing.JOptionPane; import javax.swing.JPanel; import org.jabref.gui.importer.ImportInspectionDialog; import org.jabref.logic.help.HelpFile; import org.jabref.logic.importer.ImportInspector; import org.jabref.logic.importer.OutputPrinter; import org.jabref.logic.importer.util.JSONEntryParser; import org.jabref.logic.l10n.Localization; import org.jabref.model.entry.BibEntry; import com.mashape.unirest.http.HttpResponse; import com.mashape.unirest.http.JsonNode; import com.mashape.unirest.http.Unirest; import com.mashape.unirest.http.exceptions.UnirestException; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.json.JSONArray; import org.json.JSONObject; public class SpringerFetcher implements EntryFetcher { private static final String API_URL = "http://api.springer.com/metadata/json?q="; private static final String API_KEY = "b0c7151179b3d9c1119cf325bca8460d"; private static final Log LOGGER = LogFactory.getLog(SpringerFetcher.class); private static final int MAX_PER_PAGE = 100; private boolean shouldContinue; @Override public void stopFetching() { shouldContinue = false; } @Override public boolean processQuery(String query, ImportInspector inspector, OutputPrinter status) { shouldContinue = true; try { status.setStatus(Localization.lang("Searching...")); HttpResponse<JsonNode> jsonResponse; String encodedQuery = URLEncoder.encode(query, "UTF-8"); jsonResponse = Unirest.get(API_URL + encodedQuery + "&api_key=" + API_KEY + "&p=1") .header("accept", "application/json") .asJson(); JSONObject jo = jsonResponse.getBody().getObject(); int numberToFetch = jo.getJSONArray("result").getJSONObject(0).getInt("total"); if (numberToFetch > 0) { if (numberToFetch > MAX_PER_PAGE) { boolean numberEntered = false; do { String strCount = JOptionPane.showInputDialog(Localization.lang("%0 references found. Number of references to fetch?", String.valueOf(numberToFetch))); if (strCount == null) { status.setStatus(Localization.lang("%0 import canceled", getTitle())); return false; } try { numberToFetch = Integer.parseInt(strCount.trim()); numberEntered = true; } catch (NumberFormatException ex) { status.showMessage(Localization.lang("Please enter a valid number")); } } while (!numberEntered); } int fetched = 0; // Keep track of number of items fetched for the progress bar for (int startItem = 1; startItem <= numberToFetch; startItem += MAX_PER_PAGE) { if (!shouldContinue) { break; } int noToFetch = Math.min(MAX_PER_PAGE, (numberToFetch - startItem) + 1); jsonResponse = Unirest .get(API_URL + encodedQuery + "&api_key=" + API_KEY + "&p=" + noToFetch + "&s=" + startItem) .header("accept", "application/json").asJson(); jo = jsonResponse.getBody().getObject(); if (jo.has("records")) { JSONArray results = jo.getJSONArray("records"); for (int i = 0; i < results.length(); i++) { JSONObject springerJsonEntry = results.getJSONObject(i); BibEntry entry = JSONEntryParser.parseSpringerJSONtoBibtex(springerJsonEntry); inspector.addEntry(entry); fetched++; inspector.setProgress(fetched, numberToFetch); } } } return true; } else { status.showMessage(Localization.lang("No entries found for the search string '%0'", encodedQuery), Localization.lang("Search %0", getTitle()), JOptionPane.INFORMATION_MESSAGE); return false; } } catch (IOException | UnirestException e) { LOGGER.error("Error while fetching from " + getTitle(), e); ((ImportInspectionDialog)inspector).showErrorMessage(this.getTitle(), e.getLocalizedMessage()); } return false; } @Override public String getTitle() { return "Springer"; } @Override public HelpFile getHelpPage() { return HelpFile.FETCHER_SPRINGER; } @Override public JPanel getOptionsPanel() { // No additional options available return null; } }