LoadTools.java 5.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148
  1. package com.acdp.transceivr;
  2. import okhttp3.*;
  3. import okio.BufferedSink;
  4. import org.slf4j.LoggerFactory;
  5. import java.io.IOException;
  6. import java.io.InputStream;
  7. public class LoadTools {
  8. public static final MediaType MEDIA_TYPE_BINARY
  9. = MediaType.parse("application/octet-stream");
  10. public static final MediaType MEDIA_TYPE_JSON
  11. = MediaType.get("application/json; charset=utf-8");
  12. private final static org.slf4j.Logger logger = LoggerFactory.getLogger(LoadTools.class);
  13. private static void finishTransfer(Transfer t) {
  14. t.finishedAT=System.currentTimeMillis();
  15. t.finished=true;
  16. }
  17. private static void download(Transfer t, ProgressListener progressListener) throws IOException {
  18. Request request = new Request.Builder()
  19. .url(t.from)
  20. .build();
  21. OkHttpClient client = new OkHttpClient.Builder()
  22. .addNetworkInterceptor(chain -> {
  23. Response originalResponse = chain.proceed(chain.request());
  24. return originalResponse.newBuilder()
  25. .body(new ProgressResponseBody(originalResponse.body(), progressListener))
  26. .build();
  27. })
  28. .build();
  29. var call = client.newCall(request);
  30. t.call = call;
  31. call.enqueue(new Callback() {
  32. @Override
  33. public void onFailure(Call call, IOException e) {
  34. finishTransfer(t);
  35. t.uploadError = e.toString();
  36. }
  37. @Override
  38. public void onResponse(Call call, Response response) throws IOException {
  39. t.downloadCode = response.code();
  40. if (!response.isSuccessful()) {
  41. finishTransfer(t);
  42. return;
  43. }
  44. try {
  45. upload(t, response.body().byteStream());
  46. } catch (IOException e) {
  47. e.printStackTrace();
  48. }
  49. }
  50. });
  51. }
  52. private static void upload(Transfer t, InputStream is) throws IOException {
  53. RequestBody requestBody = new RequestBody() {
  54. @Override
  55. public MediaType contentType() {
  56. return MEDIA_TYPE_BINARY;
  57. }
  58. @Override
  59. public void writeTo(BufferedSink sink) throws IOException {
  60. is.transferTo(sink.outputStream());
  61. }
  62. };
  63. OkHttpClient client = new OkHttpClient();
  64. Request request = new Request.Builder()
  65. .url(t.to)
  66. .post(requestBody)
  67. .build();
  68. client.newCall(request).enqueue(
  69. new Callback() {
  70. @Override
  71. public void onFailure(Call call, IOException e) {
  72. t.uploadError = e.toString();
  73. finishTransfer(t);
  74. }
  75. @Override
  76. public void onResponse(Call call, Response response) throws IOException {
  77. if (!response.isSuccessful()) {
  78. t.uploadError = response.toString();
  79. finishTransfer(t);
  80. }
  81. t.uploadCode = response.code();
  82. t.uploadResponseBody = response.body().string();
  83. t.uploadDone = true;
  84. if (t.cpeeCallback != null) {
  85. try {
  86. OkHttpClient client = new OkHttpClient();
  87. Request request = new Request.Builder()
  88. .url(t.cpeeCallback + "/")
  89. .put(RequestBody.create(MEDIA_TYPE_JSON, "[{}]"))
  90. .build();
  91. logger.info("putting to {}", t.cpeeCallback);
  92. Response res = client.newCall(request).execute();
  93. logger.info("result {}", res.toString());
  94. t.cpeeCallbackResult = res.body().string();
  95. t.cpeeCallbackCode = res.code();
  96. t.cpeeCallbackMessage = res.message();
  97. } catch (Exception e) {
  98. logger.warn("cpee callback failed", e);
  99. t.cpeeCallbackError = e.getMessage();
  100. finishTransfer(t);
  101. }
  102. }
  103. else {
  104. finishTransfer(t);
  105. }
  106. }
  107. }
  108. );
  109. }
  110. public static void startTransfer(Transfer t) throws IOException {
  111. final ProgressListener progressListener = new ProgressListener() {
  112. boolean firstUpdate = true;
  113. @Override
  114. public void update(long bytesRead, long contentLength, boolean done) {
  115. if (done) {
  116. t.downloadDone = true;
  117. } else {
  118. if (firstUpdate) {
  119. firstUpdate = false;
  120. if (contentLength == -1) {
  121. t.contentLength = -1;
  122. } else {
  123. t.contentLength = contentLength;
  124. }
  125. }
  126. t.bytesRead = bytesRead;
  127. t.currentTS = System.currentTimeMillis();
  128. }
  129. }
  130. };
  131. download(t, progressListener);
  132. }
  133. }