forked from I2P_Developers/i2p.i2p
Improved SU3 news file specification
This commit is contained in:
@@ -1,6 +1,7 @@
|
|||||||
package net.i2p.router.news;
|
package net.i2p.router.news;
|
||||||
|
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
import net.i2p.util.VersionComparator;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* The update metadata.
|
* The update metadata.
|
||||||
@@ -15,14 +16,41 @@ public class NewsMetadata {
|
|||||||
public String feedID;
|
public String feedID;
|
||||||
public long feedUpdated;
|
public long feedUpdated;
|
||||||
|
|
||||||
// I2P update metadata
|
// I2P metadata
|
||||||
|
public List<Release> releases;
|
||||||
|
|
||||||
|
public static class Release implements Comparable<Release> {
|
||||||
public long date;
|
public long date;
|
||||||
public String minVersion;
|
public String minVersion;
|
||||||
public String minJavaVersion;
|
public String minJavaVersion;
|
||||||
public String i2pVersion;
|
public String i2pVersion;
|
||||||
public String sudTorrent;
|
public List<Update> updates;
|
||||||
public String su2Torrent;
|
|
||||||
public String su3Torrent;
|
@Override
|
||||||
public List<String> su3Clearnet;
|
public int compareTo(Release other) {
|
||||||
public List<String> su3SSL;
|
// Sort latest version first.
|
||||||
|
return VersionComparator.comp(other.i2pVersion, i2pVersion);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public static class Update implements Comparable<Update> {
|
||||||
|
public String type;
|
||||||
|
public List<String> torrent;
|
||||||
|
public List<String> clearnet;
|
||||||
|
public List<String> ssl;
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public int compareTo(Update other) {
|
||||||
|
return Integer.compare(getTypeOrder(), other.getTypeOrder());
|
||||||
|
}
|
||||||
|
|
||||||
|
protected int getTypeOrder() {
|
||||||
|
if ("su3".equalsIgnoreCase(type))
|
||||||
|
return 1;
|
||||||
|
else if ("su2".equalsIgnoreCase(type))
|
||||||
|
return 2;
|
||||||
|
else
|
||||||
|
return 3;
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@@ -15,6 +15,7 @@ import java.util.Set;
|
|||||||
|
|
||||||
import net.i2p.I2PAppContext;
|
import net.i2p.I2PAppContext;
|
||||||
import net.i2p.util.Log;
|
import net.i2p.util.Log;
|
||||||
|
|
||||||
import org.cybergarage.util.Debug;
|
import org.cybergarage.util.Debug;
|
||||||
import org.cybergarage.xml.Attribute;
|
import org.cybergarage.xml.Attribute;
|
||||||
import org.cybergarage.xml.Node;
|
import org.cybergarage.xml.Node;
|
||||||
@@ -169,38 +170,63 @@ public class NewsXMLParser {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
Node r = feed.getNode("i2p:release");
|
List<NewsMetadata.Release> releases = new ArrayList<NewsMetadata.Release>();
|
||||||
if (r == null)
|
List<Node> releaseNodes = getNodes(feed, "i2p:release");
|
||||||
|
if (releaseNodes.size() == 0)
|
||||||
throw new I2PParserException("no release data in XML");
|
throw new I2PParserException("no release data in XML");
|
||||||
|
for (Node r : releaseNodes) {
|
||||||
|
NewsMetadata.Release release = new NewsMetadata.Release();
|
||||||
// release attributes
|
// release attributes
|
||||||
String a = r.getAttributeValue("date");
|
String a = r.getAttributeValue("date");
|
||||||
if (a.length() > 0) {
|
if (a.length() > 0) {
|
||||||
long time = RFC3339Date.parse3339Date(a);
|
long time = RFC3339Date.parse3339Date(a);
|
||||||
if (time > 0)
|
if (time > 0)
|
||||||
rv.date = time;
|
release.date = time;
|
||||||
}
|
}
|
||||||
a = r.getAttributeValue("minVersion");
|
a = r.getAttributeValue("minVersion");
|
||||||
if (a.length() > 0)
|
if (a.length() > 0)
|
||||||
rv.minVersion = a;
|
release.minVersion = a;
|
||||||
a = r.getAttributeValue("minJavaVersion");
|
a = r.getAttributeValue("minJavaVersion");
|
||||||
if (a.length() > 0)
|
if (a.length() > 0)
|
||||||
rv.minJavaVersion = a;
|
release.minJavaVersion = a;
|
||||||
// release nodes
|
// release nodes
|
||||||
n = r.getNode("i2p:version");
|
n = r.getNode("i2p:version");
|
||||||
if (n != null)
|
if (n != null)
|
||||||
rv.i2pVersion = n.getValue();
|
release.i2pVersion = n.getValue();
|
||||||
List<Node> urls = getNodes(r, "i2p:torrent");
|
|
||||||
for (Node t : urls) {
|
List<NewsMetadata.Update> updates = new ArrayList<NewsMetadata.Update>();
|
||||||
|
List<Node> updateNodes = getNodes(r, "i2p:update");
|
||||||
|
for (Node u : updateNodes) {
|
||||||
|
// returns "" for none
|
||||||
|
String type = u.getAttributeValue("type");
|
||||||
|
if (type.length() > 0) {
|
||||||
|
NewsMetadata.Update update = new NewsMetadata.Update();
|
||||||
|
update.type = type;
|
||||||
|
int totalSources = 0;
|
||||||
|
|
||||||
|
List<String> torrents = new ArrayList<String>();
|
||||||
|
List<Node> torrentNodes = getNodes(u, "i2p:torrent");
|
||||||
|
for (Node t : torrentNodes) {
|
||||||
// returns "" for none
|
// returns "" for none
|
||||||
String href = t.getAttributeValue("href");
|
String href = t.getAttributeValue("href");
|
||||||
if (href.length() > 0) {
|
if (href.length() > 0) {
|
||||||
String type = t.getAttributeValue("type");
|
torrents.add(href);
|
||||||
if (type.equals("su2"))
|
|
||||||
rv.su2Torrent = href;
|
|
||||||
else if (type.equals("su3"))
|
|
||||||
rv.su3Torrent = href;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
update.torrent = torrents;
|
||||||
|
totalSources += torrents.size();
|
||||||
|
|
||||||
|
if (totalSources == 0)
|
||||||
|
throw new I2PParserException("no sources for update type " + type);
|
||||||
|
updates.add(update);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
Collections.sort(updates);
|
||||||
|
release.updates = updates;
|
||||||
|
releases.add(release);
|
||||||
|
}
|
||||||
|
Collections.sort(releases);
|
||||||
|
rv.releases = releases;
|
||||||
|
|
||||||
return rv;
|
return rv;
|
||||||
}
|
}
|
||||||
@@ -388,8 +414,9 @@ public class NewsXMLParser {
|
|||||||
parser.parse(new File(args[0]));
|
parser.parse(new File(args[0]));
|
||||||
NewsMetadata ud = parser.getMetadata();
|
NewsMetadata ud = parser.getMetadata();
|
||||||
List<NewsEntry> entries = parser.getEntries();
|
List<NewsEntry> entries = parser.getEntries();
|
||||||
System.out.println("Latest version is " + ud.i2pVersion);
|
NewsMetadata.Release latestRelease = ud.releases.get(0);
|
||||||
System.out.println("Release timestamp: " + ud.date);
|
System.out.println("Latest version is " + latestRelease.i2pVersion);
|
||||||
|
System.out.println("Release timestamp: " + latestRelease.date);
|
||||||
System.out.println("Feed timestamp: " + ud.feedUpdated);
|
System.out.println("Feed timestamp: " + ud.feedUpdated);
|
||||||
System.out.println("Found " + entries.size() + " news entries");
|
System.out.println("Found " + entries.size() + " news entries");
|
||||||
for (int i = 0; i < entries.size(); i++) {
|
for (int i = 0; i < entries.size(); i++) {
|
||||||
|
@@ -459,22 +459,35 @@ class NewsFetcher extends UpdateRunner {
|
|||||||
*/
|
*/
|
||||||
private void outputOldNewsXML(NewsMetadata data, List<NewsEntry> entries,
|
private void outputOldNewsXML(NewsMetadata data, List<NewsEntry> entries,
|
||||||
String sudVersion, String signingKeyName, File to) throws IOException {
|
String sudVersion, String signingKeyName, File to) throws IOException {
|
||||||
|
NewsMetadata.Release latestRelease = data.releases.get(0);
|
||||||
Writer out = null;
|
Writer out = null;
|
||||||
try {
|
try {
|
||||||
out = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(to), "UTF-8"));
|
out = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(to), "UTF-8"));
|
||||||
out.write("<!--\n");
|
out.write("<!--\n");
|
||||||
// update metadata in old format
|
// update metadata in old format
|
||||||
out.write("<i2p.release ");
|
out.write("<i2p.release ");
|
||||||
if (data.i2pVersion != null)
|
if (latestRelease.i2pVersion != null)
|
||||||
out.write(" version=\"" + data.i2pVersion + '"');
|
out.write(" version=\"" + latestRelease.i2pVersion + '"');
|
||||||
if (data.minVersion != null)
|
if (latestRelease.minVersion != null)
|
||||||
out.write(" minVersion=\"" + data.minVersion + '"');
|
out.write(" minVersion=\"" + latestRelease.minVersion + '"');
|
||||||
if (data.minJavaVersion != null)
|
if (latestRelease.minJavaVersion != null)
|
||||||
out.write(" minJavaVersion=\"" + data.minJavaVersion + '"');
|
out.write(" minJavaVersion=\"" + latestRelease.minJavaVersion + '"');
|
||||||
if (data.su2Torrent != null)
|
String su3Torrent = "";
|
||||||
out.write(" su2Torrent=\"" + data.su2Torrent + '"');
|
String su2Torrent = "";
|
||||||
if (data.su3Torrent != null)
|
for (NewsMetadata.Update update : latestRelease.updates) {
|
||||||
out.write(" su3Torrent=\"" + data.su3Torrent + '"');
|
if (update.torrent.size() > 0) {
|
||||||
|
// Only take the first torrent magnet
|
||||||
|
// TODO handle multiple torrent magnetss
|
||||||
|
if ("su3".equals(update.type) && su3Torrent.isEmpty())
|
||||||
|
su3Torrent = update.torrent.get(0);
|
||||||
|
else if ("su2".equals(update.type) && su2Torrent.isEmpty())
|
||||||
|
su2Torrent = update.torrent.get(0);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (!su2Torrent.isEmpty())
|
||||||
|
out.write(" su2Torrent=\"" + su2Torrent + '"');
|
||||||
|
if (!su3Torrent.isEmpty())
|
||||||
|
out.write(" su3Torrent=\"" + su3Torrent + '"');
|
||||||
out.write("/>\n");
|
out.write("/>\n");
|
||||||
// su3 and feed metadata for debugging
|
// su3 and feed metadata for debugging
|
||||||
out.write("** News version:\t" + DataHelper.stripHTML(sudVersion) + '\n');
|
out.write("** News version:\t" + DataHelper.stripHTML(sudVersion) + '\n');
|
||||||
|
Reference in New Issue
Block a user