package org.reldb.dbrowser.ui.updates; 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.Display; import org.eclipse.swt.widgets.Label; import org.eclipse.swt.widgets.ProgressBar; import org.reldb.dbrowser.ui.version.Version; /** Check for updates. */ public class UpdatesCheck { private Display display; private Button btnGo; private Label lblProgress; private ProgressBar progressBar; private SendWorker sendWorker = null; private Object sendWorkerMutex = new Integer(0); public UpdatesCheck(Button btnSend, Label lblProgress, ProgressBar progressBar) { this.display = lblProgress.getDisplay(); this.btnGo = btnSend; this.lblProgress = lblProgress; this.progressBar = progressBar; } public UpdatesCheck(Display display) { this.display = display; } protected void initialiseProgress(String msg, int steps) { if (lblProgress == null) return; btnGo.setEnabled(false); lblProgress.setEnabled(true); progressBar.setEnabled(true); progressBar.setMaximum(steps); updateProgress(msg, 0); } protected void updateProgress(String msg, int step) { if (lblProgress == null) return; lblProgress.setText(msg); progressBar.setSelection(step); } protected void resetProgress() { if (lblProgress == null) return; updateProgress("Progress...", 0); lblProgress.setEnabled(false); progressBar.setEnabled(false); btnGo.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 { public SendWorker() {} public void publish(SendProgress progressMessage) { display.asyncExec(new Runnable() { @Override public void run() { updateProgress(progressMessage.msg, progressMessage.progress); } }); } private SendStatus status = null; public synchronized void run() { try { status = doInBackground(); } catch (Exception e) { status = new SendStatus(e); } if (display.isDisposed()) return; display.asyncExec(new Runnable() { @Override public void run() { if (display.isDisposed()) return; done(status); } }); } protected SendStatus doInBackground() throws Exception { publish(new SendProgress("Generating message...", 10)); HttpClient client = HttpClientBuilder.create().build(); try { HttpPost httppost = new HttpPost(Version.getUpdateURL()); List<NameValuePair> formparams = new ArrayList<NameValuePair>(); formparams.add(new BasicNameValuePair("RelVersion", Double.toString(Version.getVersionNumber()))); formparams.add(new BasicNameValuePair("OSName", System.getProperty("os.name"))); formparams.add(new BasicNameValuePair("OSVersion", System.getProperty("os.version"))); formparams.add(new BasicNameValuePair("OSArch", System.getProperty("os.arch"))); 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) result += input + "\n"; 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 static String getUpdateURL(SendStatus sendStatus) { String updateURL = sendStatus.getResponse().substring("Success".length() + 1).trim(); if (updateURL.startsWith("http")) return updateURL; return null; } public void doSend() { initialiseProgress("Sending...", 100); synchronized (sendWorkerMutex) { sendWorker = new SendWorker(); } sendWorker.start(); } public void doCancel() { synchronized (sendWorkerMutex) { if (sendWorker != null) sendWorker.interrupt(); else quit(); } } }