package com.llamacorp.equate; import com.llamacorp.equate.unit.Unit; import com.llamacorp.equate.unit.UnitCurrency; import com.llamacorp.equate.unit.UnitHistCurrency; import org.json.JSONException; import org.json.JSONObject; import java.text.DateFormat; import java.text.SimpleDateFormat; import java.util.Date; import java.util.Locale; public class Result { private static final String JSON_QUERY = "query"; private static final String JSON_ANSWER = "answer"; private static final String JSON_QUERY_UNIT = "query_unit"; private static final String JSON_ANSWER_UNIT = "answer_unit"; private static final String JSON_QUERY_UNIT_TEXT = "query_unit_text"; private static final String JSON_ANSWER_UNIT_TEXT = "answer_unit_text"; private static final String JSON_QUERY_UNIT_TEXT_LONG = "query_unit_text_long"; private static final String JSON_ANSWER_UNIT_TEXT_LONG = "answer_unit_text_long"; private static final String JSON_UNIT_TYPE_KEY = "unit_type_key"; private static final String JSON_CONTAINS_UNITS = "contains_units"; private static final String JSON_TIMESTAMP = "timestamp"; private String mQuery; private String mAnswer; private String mQueryUnitText; private String mAnswerUnitText; private String mQueryUnitTextLong; private String mAnswerUnitTextLong; private int mQueryUnitPosInUnitArray; private int mAnswerUnitPosInUnitArray; private String mUnitTypeKey; boolean mContainsUnits; private long mTimestamp; public Result(String query, String answer) { setQueryWithSep(query); setAnswerWithSep(answer); mQueryUnitPosInUnitArray = -1; mAnswerUnitPosInUnitArray = -1; mContainsUnits = false; mTimestamp = 0; mQueryUnitText = ""; mAnswerUnitText = ""; mQueryUnitTextLong = ""; mAnswerUnitTextLong = ""; mUnitTypeKey = ""; } public Result(JSONObject json) throws JSONException { setQuery(json.getString(JSON_QUERY)); setAnswer(json.getString(JSON_ANSWER)); mQueryUnitPosInUnitArray = json.getInt(JSON_QUERY_UNIT); mAnswerUnitPosInUnitArray = json.getInt(JSON_ANSWER_UNIT); mAnswerUnitText = json.getString(JSON_ANSWER_UNIT_TEXT); mAnswerUnitTextLong = json.getString(JSON_ANSWER_UNIT_TEXT_LONG); mQueryUnitText = json.getString(JSON_QUERY_UNIT_TEXT); mQueryUnitTextLong = json.getString(JSON_QUERY_UNIT_TEXT_LONG); mUnitTypeKey = json.getString(JSON_UNIT_TYPE_KEY); mContainsUnits = json.getBoolean(JSON_CONTAINS_UNITS); mTimestamp = json.getLong(JSON_TIMESTAMP); } public JSONObject toJSON() throws JSONException { JSONObject json = new JSONObject(); json.put(JSON_QUERY, getQuery()); json.put(JSON_ANSWER, getAnswer()); json.put(JSON_QUERY_UNIT, mQueryUnitPosInUnitArray); json.put(JSON_ANSWER_UNIT, mAnswerUnitPosInUnitArray); json.put(JSON_QUERY_UNIT_TEXT, mQueryUnitText); json.put(JSON_ANSWER_UNIT_TEXT, mAnswerUnitText); json.put(JSON_QUERY_UNIT_TEXT_LONG, mQueryUnitTextLong); json.put(JSON_ANSWER_UNIT_TEXT_LONG, mAnswerUnitTextLong); json.put(JSON_UNIT_TYPE_KEY, getUnitTypeKey()); json.put(JSON_CONTAINS_UNITS, containsUnits()); json.put(JSON_TIMESTAMP, mTimestamp); return json; } public String getQueryWithoutSep() { return ExpSeparatorHandler.removeSep(getQuery()); } /** * Returns query with separators */ private String getQuery() { return mQuery; } public void setQueryWithSep(String query) { setQuery(ExpSeparatorHandler.addSep(query)); } private void setQuery(String query) { mQuery = query; } public String getAnswerWithoutSep() { return ExpSeparatorHandler.removeSep(getAnswer()); } /** * Returns answer with separators */ private String getAnswer() { return mAnswer; } public void setAnswerWithSep(String answer) { setAnswer(ExpSeparatorHandler.addSep(answer)); } private void setAnswer(String answer) { mAnswer = answer; } /** * Set the query and answer units, and the overarching UnitType array * position * * @param queryUnit is the Unit to set for this query * @param answerUnit is the Unit to set for this answer * @param unitTypeKey is the position in the UnitType array */ public void setResultUnit(Unit queryUnit, int queryUnitPos, Unit answerUnit, int answerUnitPos, String unitTypeKey) { mAnswerUnitPosInUnitArray = answerUnitPos; mAnswerUnitText = answerUnit.toString(); mAnswerUnitTextLong = answerUnit.getLowercaseLongName(); mQueryUnitPosInUnitArray = queryUnitPos; //if we're dealing with the same historical currency, then the //years are most likely different if (queryUnit == answerUnit && queryUnit.isHistorical()){ UnitHistCurrency uc = (UnitHistCurrency) queryUnit; mQueryUnitText = uc.getPreviousShortName(); mQueryUnitTextLong = uc.getPreviousLowercaseLongName(); } else { mQueryUnitText = queryUnit.toString(); mQueryUnitTextLong = queryUnit.getLowercaseLongName(); } mUnitTypeKey = unitTypeKey; mContainsUnits = true; if (answerUnit.isDynamic() && queryUnit.isDynamic()){ //the default unit (USD) doesn't get updated if (answerUnit.toString().equals(UnitCurrency.DEFAULT_CURRENCY)) mTimestamp = ((UnitCurrency) queryUnit).getTimeOfUpdate(); else mTimestamp = ((UnitCurrency) answerUnit).getTimeOfUpdate(); } } private String formatDate(Long ld) { String dateText = ""; if (ld == 0) return dateText; //format both today and date to format as 2014-330 String nowDay = new SimpleDateFormat("y-D", Locale.US). format(new Date()); String ldDay = new SimpleDateFormat("y-D", Locale.US). format(new Date(ld)); //if the exact year and day of year are not same, just display month day if (nowDay.equals(ldDay)) dateText = DateFormat.getTimeInstance(DateFormat.SHORT). format(new Date(ld)); else dateText = new SimpleDateFormat("MMM d", Locale.US). format(new Date(ld)); return dateText; } public String getUnitTypeKey() { return mUnitTypeKey; } public int getAnswerUnitPos() { return mAnswerUnitPosInUnitArray; } public int getQueryUnitPos() { return mQueryUnitPosInUnitArray; } public boolean containsUnits() { return mContainsUnits; } public String getTimestamp() { return formatDate(mTimestamp); } public String getTextQuery() { if (mContainsUnits) return mQuery + " " + mQueryUnitText; else return mQuery; } public String getTextAnswer() { if (mContainsUnits) return mAnswer + " " + mAnswerUnitText; else return mAnswer; } public String getQueryUnitTextLong() { return mQueryUnitTextLong; } public String getAnswerUnitTextLong() { return mAnswerUnitTextLong; } }