package mediawiki.task.config.actwp; import java.io.IOException; import java.util.List; import org.json.JSONException; import mediawiki.WikidataQuery; import mediawiki.MediaWikiConnection; import mediawiki.info.Article; import mediawiki.info.wikibase.Sitelink; import mediawiki.request.ArticleForNameRequest; import mediawiki.request.wikibase.GetSitelinkRequest; public class WikidataQuerySelector implements ACtWPSelector { private WikidataQuery wdq; private MediaWikiConnection wikidata; private MediaWikiConnection wikipedia; public WikidataQuerySelector(WikidataQuery wdq, MediaWikiConnection wikidata, MediaWikiConnection wikipedia){ this.wdq = wdq; this.wikidata = wikidata; this.wikipedia = wikipedia; } public WikidataQuerySelector(String query, MediaWikiConnection wikidata, MediaWikiConnection wikipedia) { this(new WikidataQuery(query), wikidata, wikipedia); } public WikidataQuerySelector(String query) { wdq = new WikidataQuery(query); } private List<Integer> entities = null; @Override public void prepare(MediaWikiConnection wikidata, MediaWikiConnection wikipedia) { this.wikidata = wikidata; this.wikipedia = wikipedia; } @Override public void fetch() throws IOException, JSONException { if(wikidata == null || wikipedia == null) throw new IllegalStateException("please prepare first"); entities = wdq.request(); } @Override public boolean hasNext() { if(entities == null) throw new IllegalStateException("please fetch first"); return entities.iterator().hasNext(); } @Override public Article next() throws Exception { if(entities == null) throw new IllegalStateException("please fetch first"); Integer b = entities.iterator().next(); Sitelink sl = wikidata.request(new GetSitelinkRequest("Q"+b,wikipedia.getProject())); return wikipedia.request(new ArticleForNameRequest(sl.getTitle())); } @Override public void close() throws IOException { entities = null; } }