package qa.qcri.aidr.predict.communication; import java.util.ArrayList; import java.util.List; import qa.qcri.aidr.predict.classification.DocumentLabel; import qa.qcri.aidr.predict.classification.nominal.NominalLabelBC; import org.apache.log4j.Logger; import org.json.*; /** * OutputFilter contains a filter specified by an AIDR consumer, such as a * geographic bounding box or a specific ontology label. * * @author jrogstadius */ public class OutputFilter { public static final String ATTRIBUTE_FILTER = "attribute"; private static Logger logger = Logger.getLogger(OutputFilter.class); private static final String STR_CRISIS_ID = "crisis_id", STR_FILTERS = "filters", STR_TYPE = "type", STR_ATTRIBUTE_ID = "attribute_id"; public static class NominalAttributeFilter { public int attributeID; } public int crisisID; public String crisisCode; public ArrayList<NominalAttributeFilter> attributeFilters = new ArrayList<>(); public boolean hasAttributeFilters() { return attributeFilters.isEmpty(); } public boolean match(List<DocumentLabel> labels) { for (DocumentLabel label : labels) { if (label instanceof NominalLabelBC) { if (match((NominalLabelBC) label)) return true; } else logger.error("Unsupported label type: " + label); throw new RuntimeException("Unsupported label type"); } return false; } public boolean match(NominalLabelBC label) { for (NominalAttributeFilter filter : attributeFilters) { if (filter.attributeID == label.getAttributeID()) return true; } return false; } public static OutputFilter fromJson(String json) { try { //System.out.println("Received JSON : " + json); //logger.info("Received JSON: " + json); JSONObject obj = new JSONObject(json); OutputFilter filter = new OutputFilter(); //filter.crisisID = obj.getInt(STR_CRISIS_ID); filter.crisisCode = obj.getString("crisisCode"); if (obj.has(STR_FILTERS)) { JSONArray filterArr = obj.getJSONArray(STR_FILTERS); for (int i = 0; i < filterArr.length(); i++) { JSONObject fobj = filterArr.getJSONObject(i); String filterType = fobj.getString(STR_TYPE); if (filterType.equals(ATTRIBUTE_FILTER)) { NominalAttributeFilter label = new NominalAttributeFilter(); label.attributeID = fobj.getInt(STR_ATTRIBUTE_ID); filter.attributeFilters.add(label); } } } return filter; } catch (JSONException e) { logger.error("Error in parsing received json: " + json); throw new RuntimeException(e); } } }