package org.jabref.gui.importer.fetcher; import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; import java.io.UnsupportedEncodingException; import java.net.HttpURLConnection; import java.net.URL; import java.net.URLEncoder; import java.nio.charset.StandardCharsets; import javax.swing.JPanel; import org.jabref.Globals; 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.ParserResult; import org.jabref.logic.importer.fileformat.BibtexParser; import org.jabref.logic.importer.util.INSPIREBibtexFilterReader; import org.jabref.logic.l10n.Localization; import org.jabref.model.database.BibDatabase; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; /** * * This class allows to access the Slac INSPIRE database. It is just a port of the original SPIRES Fetcher. * * It can either be a GeneralFetcher to pose requests to the database or fetch individual entries. * * @author Fedor Bezrukov * @author Sheer El-Showk * * @version $Id$ * */ public class INSPIREFetcher implements EntryFetcher { private static final String INSPIRE_HOST = "inspirehep.net"; private static final Log LOGGER = LogFactory.getLog(INSPIREFetcher.class); /** * Construct the query URL * * NOTE: we truncate at 1000 returned entries but its likely INSPIRE returns fewer anyway. This shouldn't be a * problem since users should probably do more specific searches. * * @param key The key of the OAI2 entry that the url should point to. * * @return a String denoting the query URL */ private String constructUrl(String key) { String identifier; try { identifier = URLEncoder.encode(key, StandardCharsets.UTF_8.name()); } catch (UnsupportedEncodingException e) { return ""; } // At least 87 characters StringBuilder sb = new StringBuilder(87).append("http://").append(INSPIREFetcher.INSPIRE_HOST) .append("/search?ln=en&ln=en&p=find+").append(identifier) .append("&action_search=Search&sf=&so=d&rm=&rg=1000&sc=0&of=hx"); LOGGER.debug("Inspire URL: " + sb + "\n"); return sb.toString(); } /** * Constructs a INSPIRE query url from slaccitation field * * @param slaccitation * @return query string * * public static String constructUrlFromSlaccitation(String slaccitation) { String cmd = "j"; String key = * slaccitation.replaceAll("^%%CITATION = ", "").replaceAll( ";%%$", ""); if (key.matches("^\\w*-\\w*[ /].*" * )) cmd = "eprint"; try { key = URLEncoder.encode(key, "UTF-8"); } catch (UnsupportedEncodingException e) * { } StringBuffer sb = new StringBuffer("http://").append(INSPIRE_HOST) .append("/"); * sb.append("spires/find/hep/www").append("?"); sb.append("rawcmd=find+").append(cmd).append("+"); * sb.append(key); return sb.toString(); } * * /** Construct an INSPIRE query url from eprint field * * @param eprint * @return query string * * public static String constructUrlFromEprint(String eprint) { String key = eprint.replaceAll(" [.*]$", * ""); try { key = URLEncoder.encode(key, "UTF-8"); } catch (UnsupportedEncodingException e) { return ""; } * StringBuffer sb = new StringBuffer("http://").append(INSPIRE_HOST) .append("/"); * sb.append("spires/find/hep/www").append("?"); sb.append("rawcmd=find+eprint+"); sb.append(key); return * sb.toString(); } */ /** * Import an entry from an OAI2 archive. The BibEntry provided has to have the field OAI2_IDENTIFIER_FIELD set to * the search string. * * @param key The OAI2 key to fetch from ArXiv. * @return The imported BibEntry or null if none. */ private BibDatabase importInspireEntries(String key) throws IOException { String url = constructUrl(key); HttpURLConnection conn = (HttpURLConnection) new URL(url).openConnection(); conn.setRequestProperty("User-Agent", "JabRef"); InputStream inputStream = conn.getInputStream(); try (INSPIREBibtexFilterReader reader = new INSPIREBibtexFilterReader( new InputStreamReader(inputStream, StandardCharsets.UTF_8))) { ParserResult pr = new BibtexParser(Globals.prefs.getImportFormatPreferences()).parse(reader); return pr.getDatabase(); } } @Override public HelpFile getHelpPage() { return HelpFile.FETCHER_INSPIRE; } @Override public JPanel getOptionsPanel() { // we have no additional options return null; } @Override public String getTitle() { return "INSPIRE"; } @Override public void stopFetching() { // Do nothing } /* * @see java.lang.Runnable */ @Override public boolean processQuery(String query, ImportInspector dialog, OutputPrinter status) { try { status.setStatus(Localization.lang("Fetching entries from Inspire")); /* query the archive and load the results into the BibEntry */ BibDatabase bd = importInspireEntries(query); status.setStatus(Localization.lang("Adding fetched entries")); /* add the entry to the inspection dialog */ bd.getEntries().forEach(dialog::addEntry); return true; } catch (Exception e) { LOGGER.error("Error while fetching from " + getTitle(), e); ((ImportInspectionDialog)dialog).showErrorMessage(this.getTitle(), e.getLocalizedMessage()); } return false; } }