package net.sf.jabref.imports; 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 javax.swing.JOptionPane; import javax.swing.JPanel; import net.sf.jabref.BibtexDatabase; import net.sf.jabref.BibtexEntry; import net.sf.jabref.GUIGlobals; import net.sf.jabref.Globals; import net.sf.jabref.OutputPrinter; /** * * This class allows to access the Slac SPIRES database. * * It can either be a GeneralFetcher to pose requests to the database or fetch * individual entries. * * @author Fedor Bezrukov * * @version $Id$ * */ public class SPIRESFetcher implements EntryFetcher { private static String spiresHost = "www-spires.slac.stanford.edu"; public SPIRESFetcher() { } /** * Construct the query URL * * @param key * The key of the OAI2 entry that the url should poitn to. * * @return a String denoting the query URL */ public String constructUrl(String key) { String identifier = ""; try { identifier = URLEncoder.encode(key, "UTF-8"); } catch (UnsupportedEncodingException e) { return ""; } StringBuffer sb = new StringBuffer("http://").append(spiresHost) .append("/"); sb.append("spires/find/hep/www").append("?"); sb.append("rawcmd=find+"); sb.append(identifier); sb.append("&FORMAT=WWWBRIEFBIBTEX&SEQUENCE="); return sb.toString(); } /** * Constructs a SPIRES 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(spiresHost) .append("/"); sb.append("spires/find/hep/www").append("?"); sb.append("rawcmd=find+").append(cmd).append("+"); sb.append(key); return sb.toString(); } /** * Construct an SPIRES 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(spiresHost) .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 BibtexEntry 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 imnported BibtexEntry or null if none. */ private BibtexDatabase importSpiresEntries(String key, OutputPrinter frame) { String url = constructUrl(key); try { HttpURLConnection conn = (HttpURLConnection) (new URL(url)).openConnection(); conn.setRequestProperty("User-Agent", "Jabref"); InputStream inputStream = conn.getInputStream(); SPIRESBibtexFilterReader reader = new SPIRESBibtexFilterReader( new InputStreamReader(inputStream)); ParserResult pr = BibtexParser.parse(reader); return pr.getDatabase(); } catch (IOException e) { frame.showMessage( Globals.lang( "An Exception ocurred while accessing '%0'", url) + "\n\n" + e.toString(), Globals.lang(getKeyName()), JOptionPane.ERROR_MESSAGE); } catch (RuntimeException e) { frame.showMessage( Globals.lang( "An Error occurred while fetching from SPIRES source (%0):", new String[] { url }) + "\n\n" + e.getMessage(), Globals.lang(getKeyName()), JOptionPane.ERROR_MESSAGE); } return null; } // public void addSpiresURL(BibtexEntry entry) { // String url = "http://"+spiresHost+"/spires/find/hep/www?texkey+"; // url = url+entry.getCiteKey(); // entry.setField("url", url); // } // // public void addSpiresURLtoDatabase(BibtexDatabase db) { // Iterator<BibtexEntry> iter = db.getEntries().iterator(); // while (iter.hasNext()) // addSpiresURL(iter.next()); // } /* * @see net.sf.jabref.imports.EntryFetcher */ public String getHelpPage() { return "Spires.html"; } public URL getIcon() { return GUIGlobals.getIconUrl("www"); } public String getKeyName() { return "Fetch SPIRES"; } public JPanel getOptionsPanel() { // we have no additional options return null; } public String getTitle() { return Globals.menuTitle(getKeyName()); } /* * @see net.sf.jabref.gui.ImportInspectionDialog.CallBack */ public void cancelled() { } public void done(int entriesImported) { } public void stopFetching() { } /* * @see java.lang.Runnable */ public boolean processQuery(String query, ImportInspector dialog, OutputPrinter frame) { try { frame.setStatus("Fetching entries from Spires"); /* query the archive and load the results into the BibtexEntry */ BibtexDatabase bd = importSpiresEntries(query,frame); /* addSpiresURLtoDatabase(bd); */ frame.setStatus("Adding fetched entries"); /* add the entry to the inspection dialog */ if (bd.getEntryCount() > 0) for (BibtexEntry entry : bd.getEntries()) dialog.addEntry(entry); /* update the dialogs progress bar */ // dialog.setProgress(i + 1, keys.length); /* inform the inspection dialog, that we're done */ } catch (Exception e) { frame.showMessage(Globals.lang("Error while fetching from Spires: ") + e.getMessage()); e.printStackTrace(); } return true; } }