/* This code is part of Freenet. It is distributed under the GNU General
* Public License, version 2 (or at your option any later version). See
* http://www.gnu.org/ for further details of the GPL. */
package freenet.node.useralerts;
import java.io.File;
import freenet.l10n.NodeL10n;
import freenet.node.Node;
import freenet.node.updater.NodeUpdateManager;
import freenet.node.updater.RevocationChecker;
import freenet.support.HTMLNode;
import freenet.support.Logger;
import freenet.support.TimeUtil;
public class UpdatedVersionAvailableUserAlert extends AbstractUserAlert {
private final NodeUpdateManager updater;
public UpdatedVersionAvailableUserAlert(NodeUpdateManager updater){
super(false, null, null, null, null, (short) 0, false, NodeL10n.getBase().getString("UserAlert.hide"), false, null);
this.updater = updater;
}
@Override
public String getTitle() {
return l10n("title");
}
private String l10n(String key) {
return NodeL10n.getBase().getString("UpdatedVersionAvailableUserAlert."+key);
}
private String l10n(String key, String pattern, String value) {
return NodeL10n.getBase().getString("UpdatedVersionAvailableUserAlert."+key, pattern, value);
}
private String l10n(String key, String[] patterns, String[] values) {
return NodeL10n.getBase().getString("UpdatedVersionAvailableUserAlert."+key, patterns, values);
}
@Override
public String getText() {
UpdateThingy ut = createUpdateThingy();
StringBuilder sb = new StringBuilder();
sb.append(ut.firstBit);
if(ut.formText != null) {
sb.append(" <form action=\"/\" method=\"post\"><input type=\"submit\" name=\"update\" value=\"");
sb.append(ut.formText);
sb.append("\" /></form>");
}
return sb.toString();
}
@Override
public String getShortText() {
if(!updater.isArmed()) {
if(updater.canUpdateNow()) {
return l10n("shortReadyNotArmed");
} else {
return l10n("shortNotReadyNotArmed");
}
} else {
return l10n("shortArmed");
}
}
private static class UpdateThingy {
public UpdateThingy(String first, String form) {
this.firstBit = first;
this.formText = form;
}
String firstBit;
String formText;
}
@Override
public HTMLNode getHTMLText() {
UpdateThingy ut = createUpdateThingy();
HTMLNode alertNode = new HTMLNode("div");
alertNode.addChild("#", ut.firstBit);
if(ut.formText != null) {
alertNode.addChild("form", new String[] { "action", "method" }, new String[] { "/", "post" }).addChild("input", new String[] { "type", "name", "value" }, new String[] { "submit", "update", ut.formText });
alertNode.addChild("input", new String[] { "type", "name", "value" }, new String[] { "hidden", "formPassword", updater.node.clientCore.formPassword });
}
int version;
if (updater.hasNewMainJar()) {
version = updater.newMainJarVersion();
} else if (updater.fetchingNewMainJar()) {
version = updater.fetchingNewMainJarVersion();
} else {
Logger.minor(this, "Showing version available notification but not fetching or fetched.");
// Fallback
version = updater.getMainVersion();
}
updater.addChangelogLinks(version, alertNode);
updater.renderProgress(alertNode);
return alertNode;
}
private UpdateThingy createUpdateThingy() {
StringBuilder sb = new StringBuilder();
sb.append(l10n("notLatest"));
sb.append(' ');
if(updater.isArmed() && updater.inFinalCheck()) {
sb.append(l10n("finalCheck", new String[] { "count", "max", "time" },
new String[] { Integer.toString(updater.getRevocationDNFCounter()),
Integer.toString(RevocationChecker.REVOCATION_DNF_MIN), TimeUtil.formatTime(updater.timeRemainingOnCheck()) }));
sb.append(' ');
} else if(updater.isArmed()) {
sb.append(l10n("armed"));
} else {
String formText;
if(updater.canUpdateNow()) {
if(updater.hasNewMainJar()) {
sb.append(l10n("downloadedNewJar", "version", Integer.toString(updater.newMainJarVersion())));
sb.append(' ');
}
if(updater.canUpdateImmediately()) {
sb.append(l10n("clickToUpdateNow"));
formText = l10n("updateNowButton");
} else {
sb.append(l10n("clickToUpdateASAP"));
formText = l10n("updateASAPButton");
}
} else {
if(updater.fetchingFromUOM())
sb.append(l10n("fetchingUOM", "updateScript", getUpdateScriptName()));
else {
boolean fetchingNew = updater.fetchingNewMainJar();
if(fetchingNew) {
sb.append(l10n("fetchingNewNode", "nodeVersion", Integer.toString(updater.fetchingNewMainJarVersion())));
}
}
sb.append(" ");
sb.append(l10n("updateASAPQuestion"));
formText = l10n("updateASAPButton");
}
if(updater.node.updateIsUrgent()) {
sb.append(" ");
sb.append(l10n("updateIsUrgent"));
}
if(updater.brokenDependencies()) {
sb.append(" ");
sb.append(l10n("brokenDependencies", "version", Integer.toString(updater.newMainJarVersion())));
}
return new UpdateThingy(sb.toString(), formText);
}
return new UpdateThingy(sb.toString(), null);
}
private String getUpdateScriptName() {
String name;
if(File.separatorChar == '\\') {
name = "update.cmd";
} else {
name = "update.sh";
}
File f = new File(updater.node.getNodeDir(), name);
if(f.exists()) return f.toString();
f = new File(new File(updater.node.getNodeDir(), "bin"), name);
if(f.exists()) return f.toString();
return name;
}
@Override
public short getPriorityClass() {
Node node = updater.node;
if(node.updateIsUrgent())
return UserAlert.CRITICAL_ERROR;
if(updater.inFinalCheck() || updater.canUpdateNow() || !updater.isArmed())
return UserAlert.ERROR;
else
return UserAlert.MINOR;
}
@Override
public boolean isValid() {
return updater.isEnabled() && (!updater.isBlown()) &&
(updater.fetchingNewMainJar() || updater.hasNewMainJar() || updater.fetchingFromUOM());
}
@Override
public void isValid(boolean b){
// Ignore
}
}