package net.sf.jabref.imports; import java.io.*; import java.net.URL; import java.net.URLConnection; import java.util.ArrayList; import java.util.List; import javax.xml.parsers.SAXParser; import javax.xml.parsers.SAXParserFactory; import net.sf.jabref.BibtexEntry; /** * Importer for the Refer/Endnote format. * * check here for details on the format * http://www.ecst.csuchico.edu/~jacobsd/bib/formats/endnote.html */ public class MedlineImporter extends ImportFormat { /** * Return the name of this import format. */ public String getFormatName() { return "Medline"; } /* * (non-Javadoc) * * @see net.sf.jabref.imports.ImportFormat#getCLIId() */ public String getCLIId() { return "medline"; } /** * Check whether the source is in the correct format for this importer. */ public boolean isRecognizedFormat(InputStream stream) throws IOException { BufferedReader in = new BufferedReader(ImportFormatReader.getReaderDefaultEncoding(stream)); String str; int i=0; while (((str = in.readLine()) != null) && (i < 50)) { if (str.toLowerCase().indexOf("<pubmedarticle>") >= 0) return true; i++; } return false; } /** * Fetch and parse an medline item from eutils.ncbi.nlm.nih.gov. * * @param id One or several ids, separated by "," * * @return Will return an empty list on error. */ public static List<BibtexEntry> fetchMedline(String id) { String baseUrl = "http://eutils.ncbi.nlm.nih.gov/entrez/eutils/efetch.fcgi?db=pubmed&retmode=xml&rettype=citation&id=" + id; try { URL url = new URL(baseUrl); URLConnection data = url.openConnection(); return new MedlineImporter().importEntries(data.getInputStream()); } catch (IOException e) { return new ArrayList<BibtexEntry>(); } } /** * Parse the entries in the source, and return a List of BibtexEntry * objects. */ public List<BibtexEntry> importEntries(InputStream stream) throws IOException { // Obtain a factory object for creating SAX parsers SAXParserFactory parserFactory = SAXParserFactory.newInstance(); // Configure the factory object to specify attributes of the parsers it // creates parserFactory.setValidating(true); parserFactory.setNamespaceAware(true); // Now create a SAXParser object ArrayList<BibtexEntry> bibItems = null; try { SAXParser parser = parserFactory.newSAXParser(); // May throw // exceptions MedlineHandler handler = new MedlineHandler(); // Start the parser. It reads the file and calls methods of the // handler. parser.parse(stream, handler); // Switch this to true if you want to make a local copy for testing. if (false) { stream.reset(); FileOutputStream out = new FileOutputStream(new File("/home/alver/ut.txt")); int c; while ((c = stream.read()) != -1) { out.write((char) c); } out.close(); } // When you're done, report the results stored by your handler // object bibItems = handler.getItems(); } catch (javax.xml.parsers.ParserConfigurationException e1) { e1.printStackTrace(); } catch (org.xml.sax.SAXException e2) { e2.printStackTrace(); } catch (java.io.IOException e3) { e3.printStackTrace(); } return bibItems; } }