package org.reldb.dbrowser.ui.feedback;
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.List;
import org.apache.http.HttpEntity;
import org.apache.http.HttpResponse;
import org.apache.http.NameValuePair;
import org.apache.http.client.HttpClient;
import org.apache.http.client.entity.UrlEncodedFormEntity;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.impl.client.HttpClientBuilder;
import org.apache.http.message.BasicNameValuePair;
import org.eclipse.swt.widgets.Button;
import org.eclipse.swt.widgets.Label;
import org.eclipse.swt.widgets.ProgressBar;
import org.reldb.dbrowser.ui.version.Version;
/** Send a message back home. */
public class Feedback {
private Button btnSend;
private Label lblProgress;
private ProgressBar progressBar;
private SendWorker sendWorker = null;
private Object sendWorkerMutex = new Integer(0);
public Feedback(Button btnSend, Label lblProgress, ProgressBar progressBar) {
this.btnSend = btnSend;
this.lblProgress = lblProgress;
this.progressBar = progressBar;
}
protected void initialiseProgress(String msg, int steps) {
btnSend.setEnabled(false);
lblProgress.setEnabled(true);
progressBar.setEnabled(true);
progressBar.setMaximum(steps);
updateProgress(msg, 0);
}
protected void updateProgress(String msg, int step) {
lblProgress.setText(msg);
progressBar.setSelection(step);
}
protected void resetProgress() {
updateProgress("Ready...", 0);
lblProgress.setEnabled(false);
progressBar.setEnabled(false);
btnSend.setEnabled(true);
}
private static class SendProgress {
String msg;
int progress;
public SendProgress(String msg, int progress) {
this.msg = msg;
this.progress = progress;
}
}
public static class SendStatus {
private Exception exception;
private String response;
public SendStatus(Exception e) {
this.exception = e;
this.response = null;
}
public SendStatus(String response) {
this.exception = null;
this.response = response;
}
public boolean isOk() {
return this.exception == null;
}
public Exception getException() {
return exception;
}
public String getResponse() {
return response;
}
}
private class SendWorker extends Thread {
private String report;
public SendWorker(String report) {
this.report = report;
}
public void publish(SendProgress progressMessage) {
lblProgress.getDisplay().asyncExec(new Runnable() {
@Override
public void run() {
updateProgress(progressMessage.msg, progressMessage.progress);
}
});
}
private SendStatus status = null;
public void run() {
try {
status = doInBackground();
} catch (Exception e) {
status = new SendStatus(e);
}
lblProgress.getDisplay().asyncExec(new Runnable() {
@Override
public void run() {
done(status);
}
});
}
protected SendStatus doInBackground() throws Exception {
publish(new SendProgress("Generating message...", 10));
HttpClient client = HttpClientBuilder.create().build();
try {
HttpPost httppost = new HttpPost(Version.getReportLogURL());
List<NameValuePair> formparams = new ArrayList<NameValuePair>();
formparams.add(new BasicNameValuePair("RelErrorReport", report));
HttpEntity entity = new UrlEncodedFormEntity(formparams, "UTF-8");
httppost.setEntity(entity);
publish(new SendProgress("Sending message...", 50));
HttpResponse response = client.execute(httppost);
entity = response.getEntity();
publish(new SendProgress("Getting response...", 75));
BufferedReader is = new BufferedReader(new InputStreamReader(entity.getContent()));
String input;
String result = "";
while ((input = is.readLine()) != null) {
if (input.startsWith("Success") || input.startsWith("ERROR"))
result = input;
}
is.close();
publish(new SendProgress("Done", 100));
try {
Thread.sleep(1000);
} catch (InterruptedException e) {}
return new SendStatus(result);
} catch (Exception e) {
return new SendStatus(e);
}
}
protected void done(SendStatus sendStatus) {
synchronized (sendWorkerMutex) {
sendWorker = null;
}
resetProgress();
completed(sendStatus);
}
}
public void completed(SendStatus sendStatus) {}
public void quit() {}
public void doSend(String message) {
initialiseProgress("Sending...", 100);
synchronized (sendWorkerMutex) {
sendWorker = new SendWorker(message);
}
sendWorker.start();
}
public void doCancel() {
synchronized (sendWorkerMutex) {
if (sendWorker != null)
sendWorker.interrupt();
else
quit();
}
}
}