package freenet.node.useralerts;
import java.io.File;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import freenet.clients.fcp.FCPMessage;
import freenet.clients.fcp.FeedMessage;
import freenet.l10n.NodeL10n;
import freenet.node.PeerTooOldException;
import freenet.support.HTMLNode;
import freenet.support.Logger;
public class DroppedOldPeersUserAlert implements UserAlert {
private final List<String> droppedOldPeers;
private int droppedOldPeersBuild;
private Date droppedOldPeersDate;
private final File peersBrokenFile;
private final long creationTime;
public DroppedOldPeersUserAlert(File droppedPeersFile) {
this.droppedOldPeers = new ArrayList<String>();
this.peersBrokenFile = droppedPeersFile;
creationTime = System.currentTimeMillis();
this.droppedOldPeersBuild = 0;
this.droppedOldPeersDate = new Date();
}
public void add(PeerTooOldException e, String name) {
// May or may not have a name...
if (name == null) {
name = "(unknown name)";
} else {
name = "\"" + name + "\"";
}
droppedOldPeers.add(name);
if (e.buildNumber > droppedOldPeersBuild) {
droppedOldPeersBuild = e.buildNumber;
droppedOldPeersDate = e.buildDate;
}
String shortError = getLogWarning(e);
System.err.println(shortError);
Logger.error(this, shortError);
}
public boolean isEmpty() {
return droppedOldPeers.isEmpty();
}
@Override
public boolean userCanDismiss() {
return true;
}
private String getErrorIntro() {
String[] keys = new String[] { "count", "buildNumber", "buildDate", "filename" };
String[] values = new String[] { "" + droppedOldPeers.size(), "" + droppedOldPeersBuild,
droppedOldPeersDate.toString(), peersBrokenFile.toString() };
return l10n("droppingOldFriendFull", keys, values);
}
@Override
public String getTitle() {
String[] keys = new String[] { "count", "buildNumber", "buildDate", "filename" };
String[] values = new String[] { "" + droppedOldPeers.size(), "" + droppedOldPeersBuild,
droppedOldPeersDate.toString(), peersBrokenFile.toString() };
return l10n("droppingOldFriendTitle", keys, values);
}
@Override
public String getText() {
StringBuffer longErrorText = new StringBuffer();
longErrorText.append(getErrorIntro());
longErrorText.append('\n');
longErrorText.append(l10n("droppingOldFriendList"));
longErrorText.append('\n');
for (String name : droppedOldPeers) {
longErrorText.append(name);
longErrorText.append('\n');
}
longErrorText.setLength(longErrorText.length() - 1);
return longErrorText.toString();
}
@Override
public HTMLNode getHTMLText() {
HTMLNode html = new HTMLNode("#");
html.addChild("p", getErrorIntro());
html.addChild("p", l10n("droppingOldFriendList"));
HTMLNode list = html.addChild("ul");
for (String name : droppedOldPeers) {
list.addChild("li", name);
}
return html;
}
@Override
public String getShortText() {
return getTitle();
}
@Override
public short getPriorityClass() {
return CRITICAL_ERROR;
}
@Override
public boolean isValid() {
return true;
}
@Override
public void isValid(boolean validity) {
// Ignore, will be unregistered on dismiss.
}
@Override
public String dismissButtonText() {
return NodeL10n.getBase().getString("UserAlert.hide");
}
@Override
public boolean shouldUnregisterOnDismiss() {
return true;
}
@Override
public void onDismiss() {
// Do nothing.
}
@Override
public String anchor() {
return "droppedPeersUserAlert";
}
@Override
public boolean isEventNotification() {
return false;
}
@Override
public FCPMessage getFCPMessage() {
return new FeedMessage(getTitle(), getShortText(), getText(), getPriorityClass(),
getUpdatedTime());
}
@Override
public long getUpdatedTime() {
return creationTime;
}
private static String l10n(String key) {
return NodeL10n.getBase().getString("DroppedOldPeersUserAlert." + key);
}
private static String l10n(String key, String pattern, String value) {
return NodeL10n.getBase().getString("DroppedOldPeersUserAlert." + key, pattern, value);
}
private static String l10n(String key, String[] pattern, String[] value) {
return NodeL10n.getBase().getString("DroppedOldPeersUserAlert." + key, pattern, value);
}
private String getLogWarning(PeerTooOldException e) {
String[] keys = new String[] { "count", "buildNumber", "buildDate", "port" };
String[] values = new String[] {
Integer.toString(droppedOldPeers.size()),
Integer.toString(e.buildNumber),
e.buildDate.toString(),
peersBrokenFile.getPath()
};
return l10n("droppingOldFriendTitle", keys, values);
}
}