/* Copyright (C) 2011 Sascha Hunold. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. */ package net.sf.jabref.imports; import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; import java.net.MalformedURLException; import java.net.URL; import java.util.ArrayList; import java.util.List; import javax.swing.JPanel; import net.sf.jabref.BibtexEntry; import net.sf.jabref.GUIGlobals; import net.sf.jabref.OutputPrinter; public class DBLPFetcher implements EntryFetcher { private final String URL_START = "http://www.dblp.org/search/api/"; private final String URL_PART1 = "?q="; private final String URL_END = "&h=1000&c=4&f=0&format=json"; private volatile boolean shouldContinue = false; private String query; private final DBLPHelper helper = new DBLPHelper(); @Override public void stopFetching() { shouldContinue = false; } @Override public boolean processQuery(String query, ImportInspector inspector, OutputPrinter status) { boolean res = false; this.query = query; shouldContinue = true; try { String address = makeSearchURL(); //System.out.println(address); URL url = new URL(address); String page = readFromURL(url); //System.out.println(page); String[] lines = page.split("\n"); List<String> bibtexUrlList = new ArrayList<String>(); for(String line : lines) { if( line.startsWith("\"url\"") ) { String addr = line.replace("\"url\":\"", ""); addr = addr.substring(0, addr.length()-2); //System.out.println("key address: " + addr); bibtexUrlList.add(addr); } } int count = 1; for(String urlStr : bibtexUrlList) { if( ! shouldContinue ) { break; } final URL bibUrl = new URL(urlStr); String bibtexPage = readFromURL(bibUrl); //System.out.println(bibtexPage); List<BibtexEntry> bibtexList = helper.getBibTexFromPage(bibtexPage); for(BibtexEntry bibtexEntry : bibtexList ) { inspector.addEntry(bibtexEntry); if( ! shouldContinue ) { break; } } inspector.setProgress(count, bibtexUrlList.size()); count++; } // everything went smooth res = true; } catch (MalformedURLException e) { e.printStackTrace(); status.showMessage(e.getMessage()); } catch (IOException e) { e.printStackTrace(); status.showMessage(e.getMessage()); } catch(DBLPParseException e) { e.printStackTrace(); status.showMessage(e.getMessage()); } return res; } private String readFromURL(final URL source) throws IOException { final InputStream in = source.openStream(); final InputStreamReader ir = new InputStreamReader(in); final StringBuffer sbuf = new StringBuffer(); char[] cbuf = new char[256]; int read; while( (read = ir.read(cbuf)) != -1 ) { sbuf.append(cbuf, 0, read); } return sbuf.toString(); } private String makeSearchURL() { StringBuffer sb = new StringBuffer(URL_START).append(URL_PART1); String cleanedQuery = helper.cleanDBLPQuery(query); sb.append(cleanedQuery); sb.append(URL_END); return sb.toString(); } @Override public String getTitle() { return "DBLP"; } @Override public String getKeyName() { return "DBLP"; } @Override public URL getIcon() { return GUIGlobals.getIconUrl("www"); } @Override public String getHelpPage() { return null; } @Override public JPanel getOptionsPanel() { return null; } }