checkupdates.java
来自「开源项目openfire的完整源程序」· Java 代码 · 共 668 行 · 第 1/2 页
JAVA
668 行
/**
* $Revision: $
* $Date: $
*
* Copyright (C) 2006 Jive Software. All rights reserved.
*
* This software is published under the terms of the GNU Lesser Public License (LGPL),
* a copy of which is included in this distribution.
*/
package org.jivesoftware.sparkimpl.updater;
import com.thoughtworks.xstream.XStream;
import org.apache.commons.httpclient.HttpClient;
import org.apache.commons.httpclient.methods.GetMethod;
import org.apache.commons.httpclient.methods.PostMethod;
import org.apache.commons.httpclient.protocol.Protocol;
import org.jivesoftware.Spark;
import org.jivesoftware.resource.Res;
import org.jivesoftware.resource.SparkRes;
import org.jivesoftware.smack.PacketCollector;
import org.jivesoftware.smack.SmackConfiguration;
import org.jivesoftware.smack.XMPPConnection;
import org.jivesoftware.smack.XMPPException;
import org.jivesoftware.smack.filter.PacketIDFilter;
import org.jivesoftware.smack.packet.IQ;
import org.jivesoftware.smack.provider.ProviderManager;
import org.jivesoftware.smackx.packet.DiscoverItems;
import org.jivesoftware.spark.SparkManager;
import org.jivesoftware.spark.component.ConfirmDialog;
import org.jivesoftware.spark.component.ConfirmDialog.ConfirmListener;
import org.jivesoftware.spark.component.TitlePanel;
import org.jivesoftware.spark.util.BrowserLauncher;
import org.jivesoftware.spark.util.ByteFormat;
import org.jivesoftware.spark.util.GraphicUtils;
import org.jivesoftware.spark.util.ModelUtil;
import org.jivesoftware.spark.util.SwingWorker;
import org.jivesoftware.spark.util.log.Log;
import org.jivesoftware.sparkimpl.settings.JiveInfo;
import org.jivesoftware.sparkimpl.settings.local.LocalPreferences;
import org.jivesoftware.sparkimpl.settings.local.SettingsManager;
import javax.swing.JEditorPane;
import javax.swing.JFrame;
import javax.swing.JOptionPane;
import javax.swing.JProgressBar;
import javax.swing.JScrollPane;
import javax.swing.text.html.HTMLEditorKit;
import java.awt.Color;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.Insets;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.util.Calendar;
import java.util.Date;
import java.util.Iterator;
import java.util.TimerTask;
public class CheckUpdates {
private String mainUpdateURL;
private JProgressBar bar;
private TitlePanel titlePanel;
private boolean downloadComplete = false;
private boolean cancel = false;
public static boolean UPDATING = false;
private boolean sparkPluginInstalled;
private XStream xstream = new XStream();
private String sizeText;
public CheckUpdates() {
// Set the Jabber IQ Provider for Jabber:iq:spark
ProviderManager.getInstance().addIQProvider("query", "jabber:iq:spark", new SparkVersion.Provider());
// For simplicity, use an alias for the root xml tag
xstream.alias("Version", SparkVersion.class);
// Specify the main update url for JiveSoftware
this.mainUpdateURL = "http://www.igniterealtime.org/updater/updater";
sparkPluginInstalled = isSparkPluginInstalled(SparkManager.getConnection());
}
public SparkVersion newBuildAvailable() {
if (!sparkPluginInstalled && !Spark.isCustomBuild()) {
// Handle Jivesoftware.org update
return isNewBuildAvailableFromJivesoftware();
}
else if (sparkPluginInstalled) {
try {
SparkVersion serverVersion = getLatestVersion(SparkManager.getConnection());
if (isGreater(serverVersion.getVersion(), JiveInfo.getVersion())) {
return serverVersion;
}
}
catch (XMPPException e) {
}
}
return null;
}
/**
* Returns true if there is a new build available for download.
*
* @return true if there is a new build available for download.
*/
public SparkVersion isNewBuildAvailableFromJivesoftware() {
PostMethod post = new PostMethod(mainUpdateURL);
if (Spark.isWindows()) {
post.addParameter("os", "windows");
}
else if (Spark.isMac()) {
post.addParameter("os", "mac");
}
else {
post.addParameter("os", "linux");
}
// Check to see if the beta should be included.
LocalPreferences pref = SettingsManager.getLocalPreferences();
boolean isBetaCheckingEnabled = pref.isBetaCheckingEnabled();
if (isBetaCheckingEnabled) {
post.addParameter("beta", "true");
}
Protocol.registerProtocol("https", new Protocol("https", new EasySSLProtocolSocketFactory(), 443));
HttpClient httpclient = new HttpClient();
String proxyHost = System.getProperty("http.proxyHost");
String proxyPort = System.getProperty("http.proxyPort");
if (ModelUtil.hasLength(proxyHost) && ModelUtil.hasLength(proxyPort)) {
try {
httpclient.getHostConfiguration().setProxy(proxyHost, Integer.parseInt(proxyPort));
}
catch (NumberFormatException e) {
Log.error(e);
}
}
try {
int result = httpclient.executeMethod(post);
if (result != 200) {
return null;
}
String xml = post.getResponseBodyAsString();
// Server Version
SparkVersion serverVersion = (SparkVersion)xstream.fromXML(xml);
if (isGreater(serverVersion.getVersion(), JiveInfo.getVersion())) {
return serverVersion;
}
}
catch (IOException e) {
Log.error(e);
}
return null;
}
public void downloadUpdate(final File downloadedFile, final SparkVersion version) {
final java.util.Timer timer = new java.util.Timer();
// Prepare HTTP post
final GetMethod post = new GetMethod(version.getDownloadURL());
// Get HTTP client
Protocol.registerProtocol("https", new Protocol("https", new EasySSLProtocolSocketFactory(), 443));
final HttpClient httpclient = new HttpClient();
String proxyHost = System.getProperty("http.proxyHost");
String proxyPort = System.getProperty("http.proxyPort");
if (ModelUtil.hasLength(proxyHost) && ModelUtil.hasLength(proxyPort)) {
try {
httpclient.getHostConfiguration().setProxy(proxyHost, Integer.parseInt(proxyPort));
}
catch (NumberFormatException e) {
Log.error(e);
}
}
// Execute request
try {
int result = httpclient.executeMethod(post);
if (result != 200) {
return;
}
long length = post.getResponseContentLength();
int contentLength = (int)length;
bar = new JProgressBar(0, contentLength);
}
catch (IOException e) {
Log.error(e);
}
final JFrame frame = new JFrame(Res.getString("title.downloading.im.client"));
frame.setIconImage(SparkRes.getImageIcon(SparkRes.SMALL_MESSAGE_IMAGE).getImage());
titlePanel = new TitlePanel(Res.getString("title.upgrading.client"), Res.getString("message.version", version.getVersion()), SparkRes.getImageIcon(SparkRes.SEND_FILE_24x24), true);
final Thread thread = new Thread(new Runnable() {
public void run() {
try {
InputStream stream = post.getResponseBodyAsStream();
long size = post.getResponseContentLength();
ByteFormat formater = new ByteFormat();
sizeText = formater.format(size);
titlePanel.setDescription(Res.getString("message.version", version.getVersion()) + " \n" + Res.getString("message.file.size", sizeText));
downloadedFile.getParentFile().mkdirs();
FileOutputStream out = new FileOutputStream(downloadedFile);
copy(stream, out);
out.close();
if (!cancel) {
downloadComplete = true;
promptForInstallation(downloadedFile, Res.getString("title.download.complete"), Res.getString("message.restart.spark"));
}
else {
out.close();
downloadedFile.delete();
}
UPDATING = false;
frame.dispose();
}
catch (Exception ex) {
}
finally {
timer.cancel();
// Release current connection to the connection pool once you are done
post.releaseConnection();
}
}
});
frame.getContentPane().setLayout(new GridBagLayout());
frame.getContentPane().add(titlePanel, new GridBagConstraints(0, 0, 1, 1, 1.0, 0.0, GridBagConstraints.WEST, GridBagConstraints.HORIZONTAL, new Insets(5, 5, 5, 5), 0, 0));
frame.getContentPane().add(bar, new GridBagConstraints(0, 1, 1, 1, 1.0, 0.0, GridBagConstraints.WEST, GridBagConstraints.HORIZONTAL, new Insets(5, 5, 5, 5), 0, 0));
JEditorPane pane = new JEditorPane();
boolean displayContentPane = version.getChangeLogURL() != null || version.getDisplayMessage() != null;
try {
pane.setEditable(false);
if (version.getChangeLogURL() != null) {
pane.setEditorKit(new HTMLEditorKit());
pane.setPage(version.getChangeLogURL());
}
else if (version.getDisplayMessage() != null) {
pane.setText(version.getDisplayMessage());
}
if (displayContentPane) {
frame.getContentPane().add(new JScrollPane(pane), new GridBagConstraints(0, 2, 1, 1, 1.0, 1.0, GridBagConstraints.WEST, GridBagConstraints.BOTH, new Insets(5, 5, 5, 5), 0, 0));
}
}
catch (IOException e) {
Log.error(e);
}
frame.getContentPane().setBackground(Color.WHITE);
frame.pack();
if (displayContentPane) {
frame.setSize(600, 400);
}
else {
frame.setSize(400, 100);
}
frame.setLocationRelativeTo(SparkManager.getMainWindow());
GraphicUtils.centerWindowOnScreen(frame);
frame.addWindowListener(new WindowAdapter() {
public void windowClosing(WindowEvent windowEvent) {
thread.interrupt();
cancel = true;
UPDATING = false;
if (!downloadComplete) {
JOptionPane.showMessageDialog(SparkManager.getMainWindow(), Res.getString("message.updating.cancelled"), Res.getString("title.cancelled"), JOptionPane.ERROR_MESSAGE);
}
}
});
frame.setVisible(true);
thread.start();
timer.scheduleAtFixedRate(new TimerTask() {
int seconds = 1;
public void run() {
ByteFormat formatter = new ByteFormat();
long value = bar.getValue();
long average = value / seconds;
String text = formatter.format(average) + "/Sec";
String total = formatter.format(value);
titlePanel.setDescription(Res.getString("message.version", version.getVersion()) + " \n" + Res.getString("message.file.size", sizeText) + "\n" + Res.getString("message.transfer.rate") + ": " + text + "\n" + Res.getString("message.total.downloaded") + ": " + total);
seconds++;
}
}, 1000, 1000);
}
/**
* Common code for copy routines. By convention, the streams are
* closed in the same method in which they were opened. Thus,
* this method does not close the streams when the copying is done.
*/
private void copy(final InputStream in, final OutputStream out) {
int read = 0;
try {
final byte[] buffer = new byte[4096];
while (!cancel) {
int bytesRead = in.read(buffer);
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?