TracingSyncService.java 6.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197
  1. package de.tudarmstadt.informatik.hostage.sync.tracing;
  2. import java.io.BufferedReader;
  3. import java.io.IOException;
  4. import java.io.InputStreamReader;
  5. import java.io.OutputStream;
  6. import java.io.OutputStreamWriter;
  7. import java.io.StringWriter;
  8. import java.io.Writer;
  9. import java.net.HttpURLConnection;
  10. import java.net.URL;
  11. import java.security.KeyStore;
  12. import java.util.ArrayList;
  13. import java.util.HashMap;
  14. import java.util.HashSet;
  15. import java.util.Map;
  16. import java.util.Set;
  17. import org.apache.http.HttpResponse;
  18. import org.apache.http.HttpVersion;
  19. import org.apache.http.client.HttpClient;
  20. import org.apache.http.client.methods.HttpPost;
  21. import org.apache.http.conn.ClientConnectionManager;
  22. import org.apache.http.conn.scheme.PlainSocketFactory;
  23. import org.apache.http.conn.scheme.Scheme;
  24. import org.apache.http.conn.scheme.SchemeRegistry;
  25. import org.apache.http.conn.ssl.SSLSocketFactory;
  26. import org.apache.http.entity.StringEntity;
  27. import org.apache.http.impl.client.DefaultHttpClient;
  28. import org.apache.http.impl.conn.tsccm.ThreadSafeClientConnManager;
  29. import org.apache.http.params.BasicHttpParams;
  30. import org.apache.http.params.HttpParams;
  31. import org.apache.http.params.HttpProtocolParams;
  32. import org.apache.http.protocol.HTTP;
  33. import org.json.JSONException;
  34. import org.json.JSONObject;
  35. import android.app.IntentService;
  36. import android.content.Intent;
  37. import android.content.SharedPreferences;
  38. import android.content.SharedPreferences.Editor;
  39. import android.os.Bundle;
  40. import android.os.ResultReceiver;
  41. import android.preference.PreferenceManager;
  42. import android.util.Log;
  43. import de.tudarmstadt.informatik.hostage.logging.NetworkRecord;
  44. import de.tudarmstadt.informatik.hostage.logging.Record;
  45. import de.tudarmstadt.informatik.hostage.logging.SyncData;
  46. import de.tudarmstadt.informatik.hostage.logging.SyncInfoRecord;
  47. import de.tudarmstadt.informatik.hostage.logging.SyncRecord;
  48. import de.tudarmstadt.informatik.hostage.net.MySSLSocketFactory;
  49. import de.tudarmstadt.informatik.hostage.persistence.HostageDBOpenHelper;
  50. import de.tudarmstadt.informatik.hostage.sync.Synchronizer;
  51. import de.tudarmstadt.informatik.hostage.sync.android.SyncUtils;
  52. import de.tudarmstadt.informatik.hostage.ui.model.LogFilter;
  53. /**
  54. * Service that synchronizes with a specified remote server.
  55. *
  56. * @author Lars Pandikow
  57. */
  58. public class TracingSyncService extends IntentService {
  59. public static final String REMOTE_DEVICE = "de.tudarmstadt.informatik.hostage.REMOTE_DEVICE";
  60. public static final String ACTION_START_SYNC = "de.tudarmstadt.informatik.hostage.ACTION_START_SYNC";
  61. public static final String EXTRA_RECEIVER = "de.tudarmstadt.informatik.hostage.EXTRA_HANDLER";
  62. public static final String UPLOAD_SIZE = "de.tudarmstadt.informatik.hostage.UPLOAD_SIZE";
  63. public static final String UPLOAD_PROGRESS = "de.tudarmstadt.informatik.hostage.UPLOAD_PROGRESS";
  64. public static final int RECORD_UPLOADED = 0x00;
  65. public static final int RECORD_DOWNLOAD = 0x01;
  66. public static final int SYNC_COMPLETE = 0x02;
  67. public static final int SYNC_ERROR = 0x03;
  68. public static final int SYNC_UPLOAD_ERROR = 0x04;
  69. public static final int SYNC_DOWNLOAD_ERROR = 0x05;
  70. private HttpClient httpClient;
  71. private ResultReceiver receiver;
  72. HostageDBOpenHelper dbh;
  73. Synchronizer synchronizer;
  74. SharedPreferences pref;
  75. Editor editor;
  76. public TracingSyncService() {
  77. super(TracingSyncService.class.getName());
  78. }
  79. @Override
  80. public void onCreate() {
  81. super.onCreate();
  82. pref = PreferenceManager.getDefaultSharedPreferences(this);
  83. editor = pref.edit();
  84. dbh = new HostageDBOpenHelper(this);
  85. synchronizer = new Synchronizer(dbh);
  86. }
  87. /**
  88. * The IntentService calls this method from the default worker thread with
  89. * the intent that started the service. When this method returns,
  90. * IntentService stops the service, as appropriate.
  91. */
  92. @Override
  93. protected void onHandleIntent(Intent intent) {
  94. if (intent != null) {
  95. final String action = intent.getAction();
  96. if (ACTION_START_SYNC.equals(action)) {
  97. receiver = intent.getParcelableExtra(EXTRA_RECEIVER);
  98. syncNewRecords();
  99. }
  100. }
  101. }
  102. /**
  103. * Uploads all new Records to a server, specified in the settings.
  104. */
  105. private void syncNewRecords() {
  106. long lastSyncTime = pref.getLong("LAST_SYNC_TIME", 0);
  107. // Then upload to tracing
  108. String serverAddress = pref.getString("pref_upload_server", "https://ssi.cased.de"); //"https://192.168.1.118:9999"
  109. LogFilter filter = new LogFilter();
  110. filter.setAboveTimestamp(lastSyncTime);
  111. ArrayList<Record> records = dbh.getRecordsForFilter(filter);
  112. StringWriter writer = new StringWriter();
  113. int size = records.size();
  114. int offset = 1;
  115. int currOffset = 1;
  116. boolean error = false;
  117. for (Record record : records) {
  118. SyncUtils.appendRecordToStringWriter(record, writer);
  119. if(currOffset == 100 || offset == size){
  120. boolean success = SyncUtils.uploadRecordsToServer(writer.toString(), serverAddress);
  121. Log.i("Tracing upload", "Upload of record: " + offset + "/" + size + ((success) ? " successful." : " failed."));
  122. if(!success){
  123. if(receiver != null){
  124. receiver.send(SYNC_UPLOAD_ERROR, null);
  125. error = true;
  126. }
  127. break;
  128. }
  129. if (receiver != null) {
  130. Bundle data = new Bundle();
  131. data.putInt(UPLOAD_SIZE, size);
  132. data.putInt(UPLOAD_PROGRESS, offset);
  133. receiver.send(RECORD_UPLOADED, data);
  134. }
  135. writer.getBuffer().setLength(0);
  136. currOffset = 0;
  137. }
  138. offset++;
  139. currOffset++;
  140. }
  141. // First download from tracing
  142. if(receiver != null) receiver.send(RECORD_DOWNLOAD, null);
  143. SyncData syncDataFromTracing = SyncUtils.getSyncDataFromTracing(this, synchronizer);
  144. if(syncDataFromTracing == null && error){
  145. receiver.send(SYNC_ERROR, null);
  146. return;
  147. } else if(syncDataFromTracing == null){
  148. receiver.send(SYNC_DOWNLOAD_ERROR, null);
  149. return;
  150. }
  151. HashSet<String> devices = new HashSet<String>();
  152. for(SyncRecord s: syncDataFromTracing.syncRecords){
  153. devices.add(s.getDevice());
  154. }
  155. synchronizer.updateNewDevices(new ArrayList<String>(devices));
  156. synchronizer.updateFromSyncData(syncDataFromTracing);
  157. if(!error) {
  158. pref.edit().putLong("LAST_SYNC_TIME", System.currentTimeMillis()).apply();
  159. if (receiver != null) {
  160. receiver.send(SYNC_COMPLETE, null);
  161. }
  162. }
  163. }
  164. }