/*
* Copyright (c) 2010-2016, Sikuli.org, sikulix.com
* Released under the MIT License.
*
*/
package org.sikuli.ide;
import java.awt.*;
import java.awt.event.*;
import java.io.*;
import java.net.*;
import javax.swing.*;
import javax.swing.event.*;
import org.sikuli.basics.Debug;
import org.sikuli.basics.FileManager;
import org.sikuli.basics.Settings;
public class AutoUpdater {
private String details, bdetails;
private String server = "";
private String bserver = "";
private int major, minor, sub;
private int bmajor, bminor, beta;
private int smajor, sminor, ssub, sbeta;
private String name;
public static int MAJOR = 1;
public static int MINOR = 2;
public static int SUB = 3;
public static int SOMEBETA = 10;
public static int BETA = 5;
public static int FINAL = 6;
private int available = 0;
private boolean notAvailable = false;
public String whatUpdate;
public String getServer() {
return server;
}
public String getVersion() {
if (available > 0) {
return String.format("%s-%d.%d.%d", name, major, minor, sub);
}
return "";
}
public String getVersionNumber() {
if (available > 0) {
return String.format("%d.%d.%d", major, minor, sub);
}
return "";
}
public String getBeta() {
if (available == BETA || available >= SOMEBETA) {
return String.format("%s-%d.%d-Beta%d", name, bmajor, bminor, beta);
}
return "";
}
public String getBetaVersion() {
if (beta > 0) {
return String.format("%d.%d-Beta%d", bmajor, bminor, beta);
} else {
return "";
}
}
public String getDetails() {
return details;
}
public String getBetaDetails() {
return bdetails;
}
public int checkUpdate() {
for (String s : SikuliIDE.runTime.ServerList) {
try {
if (checkUpdate(s)) {
smajor = SikuliIDE.runTime.SikuliVersionMajor;
sminor = SikuliIDE.runTime.SikuliVersionMinor;
ssub = SikuliIDE.runTime.SikuliVersionSub;
sbeta = SikuliIDE.runTime.SikuliVersionBetaN;
if (sbeta > 0) {
if (smajor == major && sminor == minor) {
available = FINAL;
whatUpdate = "The final version is available: " + getVersion();
Debug.info(whatUpdate);
} else if (smajor == bmajor && sminor == bminor && beta > sbeta) {
available = BETA;
whatUpdate = "A new beta version is available: " + getVersion();
Debug.info(whatUpdate);
}
} else {
if (major > smajor) {
available = MAJOR;
whatUpdate = "A new major version is available: " + getVersion();
Debug.info(whatUpdate);
} else if (major == smajor && minor > sminor) {
available = MINOR;
whatUpdate = "A new minor version is available: " + getVersion();
Debug.info(whatUpdate);
} else if (major == smajor && minor == sminor && sub > ssub) {
available = SUB;
whatUpdate = "A new service update is available: " + getVersion();
Debug.info(whatUpdate);
}
}
if (beta > 0 && (bmajor > smajor || (bmajor == smajor && bminor > sminor))) {
available += SOMEBETA;
Debug.info("A beta version is available: " + getVersion());
}
}
} catch (Exception e) {
notAvailable = true;
}
if (notAvailable) {
Debug.log(2, "No version info available at " + s);
return 0;
}
}
return available;
}
private boolean checkUpdate(String s) throws IOException, MalformedURLException {
// contents of latestversion
//SikuliX 1 0 0 1 0 999
//DOWNLOAD https://launchpad.net/sikuli/+download
//BETA https://dl.dropboxusercontent.com/u/42895525/SikuliX/index.html
URL url = new URL(s + "/latestversion");
URLConnection conn;
if (FileManager.getProxy() != null) {
conn = url.openConnection(FileManager.getProxy());
} else {
conn = url.openConnection();
}
BufferedReader in = new BufferedReader(
new InputStreamReader(conn.getInputStream()));
String line;
if ((line = in.readLine()) != null) {
String[] vinfo = line.trim().split(" ");
if (vinfo.length > 6) {
name = vinfo[0];
major = Integer.parseInt(vinfo[1]);
minor = Integer.parseInt(vinfo[2]);
sub = Integer.parseInt(vinfo[3]);
bmajor = Integer.parseInt(vinfo[4]);
bminor = Integer.parseInt(vinfo[5]);
beta = Integer.parseInt(vinfo[6]);
} else {
notAvailable = true;
return false;
}
details = "";
if ((line = in.readLine()) != null) {
if (line.startsWith("DOWNLOAD")) {
server = line.split(" ")[1];
details += "Please download at: " + server + "<br>";
details += "-------------------------------------------------------------------------";
details += "<br><br>";
} else {
details += line;
}
}
bdetails = "";
while ((line = in.readLine()) != null) {
if (line.startsWith("BETA")) {
if (beta > 0) bdetails = line;
break;
}
details += line;
}
if (beta > 0) {
if (! "".equals(bdetails)) {
bserver = bdetails.split(" ")[1];
bdetails = "Please download at: " + bserver + "<br>";
bdetails += "-------------------------------------------------------------------------";
bdetails += "<br><br>";
}
while ((line = in.readLine()) != null) {
bdetails += line;
}
}
in.close();
return true;
}
return false;
}
public JFrame showUpdateFrame(String title, String text, int whatUpdate) {
if (whatUpdate < 0) {
return new UpdateFrame(title, text, null);
} else {
if (whatUpdate == BETA) {
return new UpdateFrame(title, text, bserver);
} else {
return new UpdateFrame(title, text, server);
}
}
}
}
class UpdateFrame extends JFrame {
public UpdateFrame(String title, String text, String server) {
setTitle(title);
setSize(300, 200);
setLocationRelativeTo(getRootPane());
Container cp = getContentPane();
cp.setLayout(new BorderLayout());
JEditorPane p = new JEditorPane("text/html", text);
p.setBorder(BorderFactory.createEmptyBorder(5, 5, 5, 5));
p.setEditable(false);
cp.add(new JScrollPane(p), BorderLayout.CENTER);
JButton btnOK = new JButton("ok");
if (server != null) {
p.addHyperlinkListener(new HyperlinkListener() {
@Override
public void hyperlinkUpdate(HyperlinkEvent e) {
if (e.getEventType().equals(HyperlinkEvent.EventType.ACTIVATED)) {
try {
FileManager.openURL(e.getURL().toString());
} catch (Exception ex) {
ex.printStackTrace();
}
}
}
});
JPanel buttonPane = new JPanel();
btnOK.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent ae) {
UpdateFrame.this.dispose();
}
});
JButton btnGo = new JButton("download");
btnGo.setToolTipText(server);
btnGo.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent ae) {
FileManager.openURL(((JButton) ae.getSource()).getToolTipText());
UpdateFrame.this.dispose();
}
});
buttonPane.setLayout(new BoxLayout(buttonPane, BoxLayout.LINE_AXIS));
buttonPane.setBorder(BorderFactory.createEmptyBorder(5, 0, 0, 0));
buttonPane.add(Box.createHorizontalGlue());
buttonPane.add(btnGo);
buttonPane.add(btnOK);
buttonPane.add(Box.createHorizontalGlue());
getRootPane().setDefaultButton(btnOK);
cp.add(buttonPane, BorderLayout.PAGE_END);
}
cp.doLayout();
pack();
setVisible(true);
btnOK.requestFocus();
}
}