LoadTools.java 5.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149
  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. var requestBuilder = new Request.Builder().url(t.to);
  65. if(t.toMethod.equals("PUT"))
  66. requestBuilder.put(requestBody);
  67. else
  68. requestBuilder.post(requestBody);
  69. var request=requestBuilder.build();
  70. client.newCall(request).enqueue(
  71. new Callback() {
  72. @Override
  73. public void onFailure(Call call, IOException e) {
  74. t.uploadError = e.toString();
  75. finishTransfer(t);
  76. }
  77. @Override
  78. public void onResponse(Call call, Response response) throws IOException {
  79. if (!response.isSuccessful()) {
  80. t.uploadError = response.toString();
  81. finishTransfer(t);
  82. }
  83. t.uploadCode = response.code();
  84. t.uploadResponseBody = response.body().string();
  85. t.uploadDone = true;
  86. if (t.cpeeCallback != null) {
  87. try {
  88. OkHttpClient client = new OkHttpClient();
  89. Request request = new Request.Builder()
  90. .url(t.cpeeCallback + "/")
  91. .put(RequestBody.create(MEDIA_TYPE_JSON, "[{}]"))
  92. .build();
  93. logger.info("putting to {}", t.cpeeCallback);
  94. Response res = client.newCall(request).execute();
  95. logger.info("result {}", res.toString());
  96. t.cpeeCallbackResult = res.body().string();
  97. t.cpeeCallbackCode = res.code();
  98. t.cpeeCallbackMessage = res.message();
  99. } catch (Exception e) {
  100. logger.warn("cpee callback failed", e);
  101. t.cpeeCallbackError = e.getMessage();
  102. finishTransfer(t);
  103. }
  104. }
  105. else {
  106. finishTransfer(t);
  107. }
  108. }
  109. }
  110. );
  111. }
  112. public static void startTransfer(Transfer t) throws IOException {
  113. final ProgressListener progressListener = new ProgressListener() {
  114. boolean firstUpdate = true;
  115. @Override
  116. public void update(long bytesRead, long contentLength, boolean done) {
  117. if (done) {
  118. t.downloadDone = true;
  119. } else {
  120. if (firstUpdate) {
  121. firstUpdate = false;
  122. if (contentLength == -1) {
  123. t.contentLength = -1;
  124. } else {
  125. t.contentLength = contentLength;
  126. }
  127. }
  128. t.bytesRead = bytesRead;
  129. t.currentTS = System.currentTimeMillis();
  130. }
  131. }
  132. };
  133. download(t, progressListener);
  134. }
  135. }