package com.limegroup.gnutella.malware;
import java.io.File;
import java.io.FileNotFoundException;
import java.util.Comparator;
import java.util.Scanner;
import org.limewire.collection.SortedList;
import org.limewire.core.api.malware.AntivirusUpdateType;
import org.limewire.logging.Log;
import org.limewire.logging.LogFactory;
public class NFOFile {
private static final Log LOG = LogFactory.getLog(NFOFile.class);
public class Entry implements Comparable <Entry>{
private final String path;
private final Integer version;
private final AntivirusUpdateType type;
public Entry(String path, Integer version, AntivirusUpdateType type) {
this.path = path;
this.version = version;
this.type = type;
}
public String getPath() {
return path;
}
public int getVersion() {
return version;
}
public AntivirusUpdateType getType() {
return type;
}
@Override
public int compareTo(Entry o) {
return version.compareTo(o.version);
}
}
public static class EntryComparator implements Comparator<Entry> {
@Override
public int compare(Entry o1, Entry o2) {
return o1.compareTo(o2);
}
}
private SortedList<Entry> incrementalEntries = new SortedList<Entry>(new EntryComparator());
private SortedList<Entry> fullEntries = new SortedList<Entry>(new EntryComparator());
public NFOFile(File file) throws FileNotFoundException {
Scanner scanner = new Scanner(file);
while(scanner.hasNextLine()) {
String line = scanner.nextLine();
if(!line.startsWith("#") && !line.startsWith("!")) {
String[] words = line.split(":");
if(words.length == 2) {
words[0] = words[0].trim();
words[1] = words[1].trim();
String name = words[1];
int extIndex = name.lastIndexOf('.');
if(extIndex > -1) {
name = name.substring(0, extIndex);
if(name.length() >= 4) {
try {
int version = Integer.valueOf(name.substring(name.length() - 4));
if(words[0].equals("IVDB")) {
incrementalEntries.add(new Entry(words[1], version, AntivirusUpdateType.INCREMENTAL));
} else if(words[0].equals("VDB")) {
fullEntries.add(new Entry(words[1], version, AntivirusUpdateType.FULL));
}
} catch (NumberFormatException nfe) {
LOG.debug("unable to parse version", nfe);
}
}
}
}
}
}
scanner.close();
}
public SortedList<Entry> getIncrementalEntries() {
return incrementalEntries;
}
public SortedList<Entry> getFullEntries() {
return fullEntries;
}
}