package com.sunlightlabs.congress.services; import com.sunlightlabs.congress.models.CongressException; import com.sunlightlabs.congress.models.Legislator; import org.json.JSONArray; import org.json.JSONException; import org.json.JSONObject; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; public class LegislatorService { private static String[] basicFields = new String[] { "bioguide_id", "thomas_id", "govtrack_id", "in_office", "party", "gender", "state", "state_name", "district", "title", "chamber", "senate_class", "birthday", "term_start", "term_end", "leadership_role", "first_name", "nickname", "middle_name", "last_name", "name_suffix", "phone", "website", "office", "twitter_id", "youtube_id", "facebook_id" }; public static List<Legislator> allWhere(String key, String value) throws CongressException { Map<String,String> params = new HashMap<String,String>(); params.put(key, value); params.put("order", "last_name__asc"); params.put("per_page", "all"); return legislatorsFor(Congress.url("legislators", basicFields, params)); } public static List<Legislator> allForZipCode(String zip) throws CongressException { Map<String,String> params = new HashMap<String,String>(); params.put("zip", zip); return legislatorsFor(Congress.url("legislators/locate", basicFields, params)); } public static List<Legislator> allForLatLong(double latitude, double longitude) throws CongressException { Map<String,String> params = new HashMap<String,String>(); params.put("latitude", String.valueOf(latitude)); params.put("longitude", String.valueOf(longitude)); return legislatorsFor(Congress.url("legislators/locate", basicFields, params)); } public static Legislator find(String bioguideId) throws CongressException { Map<String,String> params = new HashMap<String,String>(); params.put("bioguide_id", bioguideId); params.put("all_legislators", "true"); return legislatorFor(Congress.url("legislators", basicFields, params)); } /* JSON parsers, also useful for other service endpoints within this package */ protected static Legislator fromAPI(JSONObject json) throws JSONException, CongressException { if (json == null) return null; Legislator legislator = new Legislator(); if (!json.isNull("bioguide_id")) legislator.bioguide_id = json.getString("bioguide_id"); if (!json.isNull("govtrack_id")) legislator.govtrack_id = json.getString("govtrack_id"); if (!json.isNull("thomas_id")) legislator.thomas_id = json.getString("thomas_id"); if (!json.isNull("in_office")) legislator.in_office = json.getBoolean("in_office"); if (!json.isNull("first_name")) legislator.first_name = json.getString("first_name"); if (!json.isNull("last_name")) legislator.last_name = json.getString("last_name"); if (!json.isNull("nickname")) legislator.nickname = json.getString("nickname"); if (!json.isNull("name_suffix")) legislator.name_suffix = json.getString("name_suffix"); if (!json.isNull("title")) legislator.title = json.getString("title"); if (!json.isNull("party")) legislator.party = json.getString("party"); if (!json.isNull("state")) legislator.state = json.getString("state"); if (!json.isNull("district")) legislator.district = json.getString("district"); if (!json.isNull("chamber")) legislator.chamber = json.getString("chamber"); if (!json.isNull("term_start")) legislator.term_start = json.getString("term_start"); if (!json.isNull("term_end")) legislator.term_end = json.getString("term_end"); if (!json.isNull("leadership_role")) legislator.leadership_role = json.getString("leadership_role"); if (!json.isNull("gender")) legislator.gender = json.getString("gender"); if (!json.isNull("office")) legislator.office = json.getString("office"); if (!json.isNull("website")) legislator.website = json.getString("website"); if (!json.isNull("phone")) legislator.phone = json.getString("phone"); if (!json.isNull("youtube_id")) legislator.youtube_id = json.getString("youtube_id"); if (!json.isNull("twitter_id")) legislator.twitter_id = json.getString("twitter_id"); if (!json.isNull("facebook_id")) legislator.facebook_id = json.getString("facebook_id"); return legislator; } private static Legislator legislatorFor(String url) throws CongressException { try { return fromAPI(Congress.firstResult(url)); } catch (JSONException e) { throw new CongressException(e, "Problem parsing the JSON from " + url); } } private static List<Legislator> legislatorsFor(String url) throws CongressException { List<Legislator> legislators = new ArrayList<Legislator>(); try { JSONArray results = Congress.resultsFor(url); int length = results.length(); for (int i = 0; i < length; i++) legislators.add(fromAPI(results.getJSONObject(i))); } catch (JSONException e) { throw new CongressException(e, "Problem parsing the JSON from " + url); } return legislators; } }