package org.jabref.logic.importer.fetcher; import java.net.MalformedURLException; import java.net.URISyntaxException; import java.net.URL; import java.util.Arrays; import java.util.Collection; import java.util.LinkedList; import java.util.List; import java.util.Objects; import java.util.stream.Collectors; import org.jabref.logic.help.HelpFile; import org.jabref.logic.importer.FetcherException; import org.jabref.logic.importer.Parser; import org.jabref.logic.importer.SearchBasedParserFetcher; import org.jabref.logic.importer.fileformat.GvkParser; import org.apache.http.client.utils.URIBuilder; public class GvkFetcher implements SearchBasedParserFetcher { private static final String URL_PATTERN = "http://sru.gbv.de/gvk?"; /** * Searchkeys are used to specify a search request. For example "tit" stands for "title". * If no searchkey is used, the default searchkey "all" is used. */ private final Collection<String> searchKeys = Arrays.asList("all", "tit", "per", "thm", "slw", "txt", "num", "kon", "ppn", "bkl", "erj"); @Override public String getName() { return "GVK"; } @Override public HelpFile getHelpPage() { return HelpFile.FETCHER_GVK; } private String getSearchQueryStringForComplexQuery(List<String> queryList) { String query = ""; boolean lastWasNoKey = false; for (String key : queryList) { if (searchKeys.contains(key)) { if (lastWasNoKey) { query = query + "and "; } query = query + "pica." + key + "="; } else { query = query + key + " "; lastWasNoKey = true; } } return query.trim(); } protected String getSearchQueryString(String query) { Objects.requireNonNull(query); LinkedList<String> queryList = new LinkedList<>(Arrays.asList(query.split("\\s"))); if (searchKeys.contains(queryList.get(0))) { return getSearchQueryStringForComplexQuery(queryList); } else { // query as pica.all return queryList.stream().collect(Collectors.joining(" ", "pica.all=", "")); } } @Override public URL getURLForQuery(String query) throws URISyntaxException, MalformedURLException, FetcherException { String gvkQuery = getSearchQueryString(query); URIBuilder uriBuilder = new URIBuilder(URL_PATTERN); uriBuilder.addParameter("version", "1.1"); uriBuilder.addParameter("operation", "searchRetrieve"); uriBuilder.addParameter("query", gvkQuery); uriBuilder.addParameter("maximumRecords", "50"); uriBuilder.addParameter("recordSchema", "picaxml"); uriBuilder.addParameter("sortKeys", "Year,,1"); return uriBuilder.build().toURL(); } @Override public Parser getParser() { return new GvkParser(); } }