/* Copyright (c) 2009, Ryo IGARASHI <rigarash@gmail.com>
* All rights reserved.
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are met:
*
* * Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* * Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
*
* THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS "AS IS" AND ANY
* EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
* DISCLAIMED. IN NO EVENT SHALL THE REGENTS AND CONTRIBUTORS BE LIABLE FOR ANY
* DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
package net.sf.jabref.imports;
import java.util.Set;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.BufferedInputStream;
import java.io.BufferedReader;
import java.net.HttpURLConnection;
import java.net.URL;
import javax.xml.stream.XMLInputFactory;
import javax.xml.stream.XMLStreamReader;
import javax.xml.stream.XMLStreamException;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import net.sf.jabref.GUIGlobals;
import net.sf.jabref.Globals;
import net.sf.jabref.OutputPrinter;
import net.sf.jabref.BibtexEntry;
import net.sf.jabref.BibtexDatabase;
import net.sf.jabref.imports.BibtexParser;
/**
*
* This class handles accessing and obtaining BibTeX entry
* from ADS(The NASA Astrophysics Data System).
* Fetching using DOI(Document Object Identifier) is only supported.
*
* @author Ryo IGARASHI
* @version $Id$
*/
public class ADSFetcher implements EntryFetcher {
public JPanel getOptionsPanel() {
// No option panel
return null;
}
public String getHelpPage() {
// TODO: No help page
return null;
}
public URL getIcon() {
return GUIGlobals.getIconUrl("www");
}
public String getKeyName() {
return "ADS from ADS-DOI";
}
public String getTitle() {
return Globals.menuTitle(getKeyName());
}
public boolean processQuery(String query, ImportInspector dialog, OutputPrinter status) {
try {
/* Remove "doi:" scheme identifier */
query = query.replaceAll("^(doi:|DOI:)", "");
/* Allow fetching only 1 key */
String key = query;
/* Query ADS and load the results into the BibtexDatabase */
status.setStatus(Globals.lang("Processing ") + key);
BibtexDatabase bd = importADSEntries(key, status);
/* Add the entry to the inspection dialog */
status.setStatus("Adding fetched entries");
if (bd.getEntryCount() > 0) {
for (BibtexEntry entry : bd.getEntries()) {
importADSAbstract(key, entry, status);
dialog.addEntry(entry);
}
}
} catch (Exception e) {
status.setStatus(Globals.lang("Error while fetching from ADS") + ": " + e.getMessage());
e.printStackTrace();
}
return true;
}
public void stopFetching() {
}
public BibtexDatabase importADSEntries(String key, OutputPrinter status) {
String url = constructUrl(key);
try {
URL ADSUrl = new URL(url + "&data_type=BIBTEX");
HttpURLConnection ADSConnection = (HttpURLConnection) ADSUrl.openConnection();
ADSConnection.setRequestProperty("User-Agent", "Jabref");
InputStream is = ADSConnection.getInputStream();
BufferedReader reader = new BufferedReader(new InputStreamReader(is));
ParserResult pr = BibtexParser.parse(reader);
return pr.getDatabase();
} catch (IOException e) {
status.showMessage(Globals.lang(
"An Exception ocurred while accessing '%0'", url)
+ "\n\n" + e.toString(), Globals.lang(getKeyName()), JOptionPane.ERROR_MESSAGE);
} catch (RuntimeException e) {
status.showMessage(Globals.lang(
"An Error occurred while fetching from ADS (%0):", new String[]{url})
+ "\n\n" + e.getMessage(), Globals.lang(getKeyName()), JOptionPane.ERROR_MESSAGE);
}
return null;
}
public String constructUrl(String key) {
return "http://adsabs.harvard.edu/doi/" + key;
}
public void importADSAbstract(String key, BibtexEntry entry, OutputPrinter status) {
/* TODO: construct ADSUrl from BibtexEntry */
String url = constructUrl(key);
try {
URL ADSUrl = new URL(url + "&data_type=XML");
HttpURLConnection ADSConnection = (HttpURLConnection) ADSUrl.openConnection();
ADSConnection.setRequestProperty("User-Agent", "Jabref");
BufferedInputStream bis = new BufferedInputStream(ADSConnection.getInputStream());
XMLInputFactory factory = XMLInputFactory.newInstance();
XMLStreamReader reader = factory.createXMLStreamReader(bis);
boolean isAbstract = false;
String abstractText = "";
while (reader.hasNext()) {
reader.next();
if (reader.isStartElement() &&
reader.getLocalName() == "abstract") {
isAbstract = true;
}
if (isAbstract && reader.isCharacters()) {
abstractText = abstractText + reader.getText();
}
if (isAbstract && reader.isEndElement()) {
isAbstract = false;
}
}
abstractText = abstractText.replace("\n", " ");
entry.setField("abstract", abstractText);
} catch (XMLStreamException e) {
status.showMessage(Globals.lang(
"An Error occurred while parsing abstract"),
Globals.lang(getKeyName()), JOptionPane.ERROR_MESSAGE);
} catch (IOException e) {
status.showMessage(Globals.lang(
"An Exception ocurred while accessing '%0'", url)
+ "\n\n" + e.toString(), Globals.lang(getKeyName()), JOptionPane.ERROR_MESSAGE);
} catch (RuntimeException e) {
status.showMessage(Globals.lang(
"An Error occurred while fetching from ADS (%0):", new String[]{url})
+ "\n\n" + e.getMessage(), Globals.lang(getKeyName()), JOptionPane.ERROR_MESSAGE);
}
}
}