package net.ktnx.mobileledger.async;
-import android.content.res.Resources;
import android.os.AsyncTask;
import android.util.Log;
-import android.util.SparseArray;
-import com.fasterxml.jackson.databind.ObjectMapper;
-import com.fasterxml.jackson.databind.ObjectWriter;
-
-import net.ktnx.mobileledger.R;
+import net.ktnx.mobileledger.json.API;
+import net.ktnx.mobileledger.json.ApiNotSupportedException;
+import net.ktnx.mobileledger.json.Gateway;
import net.ktnx.mobileledger.model.LedgerTransaction;
import net.ktnx.mobileledger.model.LedgerTransactionAccount;
import net.ktnx.mobileledger.model.MobileLedgerProfile;
mProfile = profile;
simulate = false;
}
- private boolean send_1_15_OK() throws IOException {
- HttpURLConnection http = NetworkUtil.prepareConnection(mProfile, "add");
- http.setRequestMethod("PUT");
- http.setRequestProperty("Content-Type", "application/json");
- http.setRequestProperty("Accept", "*/*");
-
- net.ktnx.mobileledger.json.v1_15.ParsedLedgerTransaction jsonTransaction =
- net.ktnx.mobileledger.json.v1_15.ParsedLedgerTransaction.fromLedgerTransaction(
- transaction);
- ObjectMapper mapper = new ObjectMapper();
- ObjectWriter writer =
- mapper.writerFor(net.ktnx.mobileledger.json.v1_15.ParsedLedgerTransaction.class);
- String body = writer.writeValueAsString(jsonTransaction);
-
- return sendRequest(http, body);
- }
- private boolean send_1_14_OK() throws IOException {
+ private void sendOK(API apiVersion) throws IOException, ApiNotSupportedException {
HttpURLConnection http = NetworkUtil.prepareConnection(mProfile, "add");
http.setRequestMethod("PUT");
http.setRequestProperty("Content-Type", "application/json");
http.setRequestProperty("Accept", "*/*");
- net.ktnx.mobileledger.json.v1_14.ParsedLedgerTransaction jsonTransaction =
- net.ktnx.mobileledger.json.v1_14.ParsedLedgerTransaction.fromLedgerTransaction(
- transaction);
- ObjectMapper mapper = new ObjectMapper();
- ObjectWriter writer =
- mapper.writerFor(net.ktnx.mobileledger.json.v1_14.ParsedLedgerTransaction.class);
- String body = writer.writeValueAsString(jsonTransaction);
+ Gateway gateway = Gateway.forApiVersion(apiVersion);
+ String body = gateway.transactionSaveRequest(transaction);
- return sendRequest(http, body);
+ Logger.debug("network", "Sending using API " + apiVersion);
+ sendRequest(http, body);
}
- private boolean sendRequest(HttpURLConnection http, String body) throws IOException {
+ private void sendRequest(HttpURLConnection http, String body)
+ throws IOException, ApiNotSupportedException {
if (simulate) {
debug("network", "The request would be: " + body);
try {
Logger.debug("network", ex.toString());
}
- return true;
+ return;
}
byte[] bodyBytes = body.getBytes(StandardCharsets.UTF_8);
case 400:
case 405: {
BufferedReader reader = new BufferedReader(new InputStreamReader(resp));
- String line;
+ StringBuilder errorLines = new StringBuilder();
int count = 0;
while (count <= 5) {
- line = reader.readLine();
+ String line = reader.readLine();
if (line == null)
break;
Logger.debug("network", line);
+
+ if (errorLines.length() != 0)
+ errorLines.append("\n");
+
+ errorLines.append(line);
count++;
}
- return false; // will cause a retry with the legacy method
+ throw new ApiNotSupportedException(errorLines.toString());
}
default:
BufferedReader reader = new BufferedReader(new InputStreamReader(resp));
}
}
}
-
- return true;
}
private boolean legacySendOK() throws IOException {
HttpURLConnection http = NetworkUtil.prepareConnection(mProfile, "add");
try {
transaction = ledgerTransactions[0];
- switch (mProfile.getApiVersion()) {
+ final API profileApiVersion = mProfile.getApiVersion();
+ switch (profileApiVersion) {
case auto:
- Logger.debug("network", "Trying version 1.5.");
- if (!send_1_15_OK()) {
- Logger.debug("network", "Version 1.5 request failed. Trying with 1.14");
- if (!send_1_14_OK()) {
- Logger.debug("network",
- "Version 1.14 failed too. Trying HTML form emulation");
- legacySendOkWithRetry();
+ boolean sendOK = false;
+ for (API ver : API.allVersions) {
+ Logger.debug("network", "Trying version " + ver);
+ try {
+ sendOK(ver);
+ sendOK = true;
+ Logger.debug("network", "Version " + ver + " request succeeded");
+
+ break;
}
- else {
- Logger.debug("network", "Version 1.14 request succeeded");
+ catch (ApiNotSupportedException e) {
+ Logger.debug("network", "Version " + ver + " seems not supported");
}
}
- else {
- Logger.debug("network", "Version 1.15 request succeeded");
+
+ if (!sendOK) {
+ Logger.debug("network", "Trying HTML form emulation");
+ legacySendOkWithRetry();
}
break;
case html:
legacySendOkWithRetry();
break;
case v1_14:
- send_1_14_OK();
- break;
case v1_15:
- send_1_15_OK();
+ case v1_19_1:
+ sendOK(profileApiVersion);
break;
default:
- throw new IllegalStateException(
- "Unexpected API version: " + mProfile.getApiVersion());
+ throw new IllegalStateException("Unexpected API version: " + profileApiVersion);
}
}
- catch (Exception e) {
+ catch (ApiNotSupportedException | Exception e) {
e.printStackTrace();
error = e.getMessage();
}
taskCallback.done(error);
}
- public enum API {
- auto(0), html(-1), v1_14(-2), v1_15(-3), v1_19_1(-4);
- private static final SparseArray<API> map = new SparseArray<>();
- public static API[] allVersions = {v1_19_1, v1_15, v1_14};
-
- static {
- for (API item : API.values()) {
- map.put(item.value, item);
- }
- }
-
- private final int value;
-
- API(int value) {
- this.value = value;
- }
- public static API valueOf(int i) {
- return map.get(i, auto);
- }
- public int toInt() {
- return this.value;
- }
- public String getDescription(Resources resources) {
- switch (this) {
- case auto:
- return resources.getString(R.string.api_auto);
- case html:
- return resources.getString(R.string.api_html);
- case v1_14:
- return resources.getString(R.string.api_1_14);
- case v1_15:
- return resources.getString(R.string.api_1_15);
- case v1_19_1:
- return resources.getString(R.string.api_1_19_1);
- default:
- throw new IllegalStateException("Unexpected value: " + value);
- }
- }
- public String getDescription() {
- switch (this) {
- case auto:
- return "(automatic)";
- case html:
- return "(HTML)";
- case v1_14:
- return "1.14";
- case v1_15:
- return "1.15";
- case v1_19_1:
- return "1.19.1";
- default:
- throw new IllegalStateException("Unexpected value: " + this);
- }
- }
- }
}
\ No newline at end of file