package bluej.pkgmgr;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.URL;

import javafx.application.Platform;
import javafx.scene.Node;
import javafx.scene.control.ButtonBar;
import javafx.scene.control.ButtonType;
import javafx.scene.control.Dialog;
import javafx.scene.control.DialogPane;
import javafx.scene.control.Label;
import javafx.scene.control.TextArea;
import javafx.scene.layout.VBox;
import javafx.stage.Modality;
import javafx.stage.Window;

import bluej.utility.javafx.JavaFXUtil;
import threadchecker.OnThread;
import threadchecker.Tag;
import bluej.Boot;
import bluej.Config;
import bluej.utility.Debug;


| Dialog implementing version check functionality. | | @author Michael Kolling | @OnThread(Tag.FXPlatform) final public class VersionCheckDialog extends Dialog<Void>{ private static final String dialogTitle = Config.getString("pkgmgr.versionDlg.title"); private static final String helpLine1 = Config.getString("pkgmgr.versionDlg.helpLine1"); private static final String helpLine2 = Config.getString("pkgmgr.versionDlg.helpLine2"); private static final String versionURL = Config.getPropString("bluej.url.versionCheck"); private TextArea textArea; private String newVersion = null; private Thread versionThread = null; private boolean isClosed = false;
| Create a new version check dialogue and make it visible. | public VersionCheckDialog(Window parent) { setTitle(dialogTitle); initOwner(parent); initModality(Modality.WINDOW_MODAL); setDialogPane(new DialogPane() { @Override protected @OnThread(Tag.FX) Node createButtonBar() { ButtonBar buttonBar = (ButtonBar)super.createButtonBar(); buttonBar.setButtonOrder("_C_"); return buttonBar; } }); Config.addDialogStylesheets(getDialogPane()); getDialogPane().getButtonTypes().add(ButtonType.CLOSE); makeDialog(); }
| Perform a version check. | private void doVersionCheck() { textArea.setText(Config.getString("pkgmgr.checkingVersion")); versionThread = new VersionChecker(); versionThread.start(); }
| Create the dialog interface. | private void makeDialog() { VBox mainPanel = new VBox(); { JavaFXUtil.addStyleClass(mainPanel, "version-check-dialog-content"); Label helpLabel = new Label(helpLine1 + " " + helpLine2); helpLabel.setWrapText(true); helpLabel.setMaxWidth(400.0); mainPanel.getChildren().add(helpLabel); textArea = new TextArea(); textArea.setEditable(false); textArea.setWrapText(true); textArea.setMaxWidth(400.0); mainPanel.getChildren().add(textArea); } getDialogPane().setContent(mainPanel); doVersionCheck(); } @OnThread(Tag.Any) private void setTextLater(String txt) { Platform.runLater(() -> textArea.setText(txt)); }
| Private class to run the actual version checking in separate thread. | private class VersionChecker extends Thread { @OnThread(Tag.Any) public VersionChecker() { }
| Do a version check. That is: open a URL connection to the remote | version file and read it. Display version info as appropriate. | @OnThread(value = Tag.Worker, ignoreParent = true) public void run() { try { InputStream is = new URL(versionURL).openStream(); BufferedReader reader = new BufferedReader(new InputStreamReader(is)); if (isOutOfDate(reader)) { if (!isClosed) displayNewVersionInfo(reader); } else { if (!isClosed) setTextLater(Config.getString("pkgmgr.versionDlg.upToDate")); } } catch(IOException exc) { if (!isClosed) setTextLater("Error: could not access remote version information"); Debug.reportError("IO error when trying to access URL\n" + exc); } }
| Given a reader for the (remote) version file, check whether this | version is out of date. We know that the first line of the version | file contains the up-to-date version number. | @OnThread(Tag.Worker) private boolean isOutOfDate(BufferedReader versionReader) { try { newVersion = versionReader.readLine(); if (newVersion != null) newVersion = newVersion.trim(); } catch(IOException exc) { setTextLater("Error: could not read remote version information"); Debug.reportError("IO error when reading remote version info\n" + exc); } return ! Boot.BLUEJ_VERSION.equals(newVersion); }
| Given a reader for the (remote) version file, read the version | info text out of it and display it in the text area. | @OnThread(Tag.Worker) private void displayNewVersionInfo(BufferedReader versionReader) { if (newVersion == null) setTextLater("Error: could not read remote version info"); else { StringBuffer text = new StringBuffer(Config.getString("pkgmgr.versionDlg.currentVersion")); text.append(" "); text.append(Boot.BLUEJ_VERSION); text.append("\n"); text.append(Config.getString("pkgmgr.versionDlg.newVersion")); text.append(" "); text.append(newVersion); text.append("\n"); try { String line = versionReader.readLine(); while (line != null) { text.append(line); text.append("\n"); line = versionReader.readLine(); } } catch(IOException exc) { Debug.reportError("IO error when reading from version file"); } Platform.runLater(() -> { textArea.setText(text.toString()); textArea.positionCaret(0); }); } } } }

.   VersionCheckDialog
.   doVersionCheck
.   makeDialog
.   setTextLater

top, use, map, class VersionChecker

.   VersionChecker
.   run
.   isOutOfDate
.   displayNewVersionInfo




227 neLoCode + 13 LoComm