package com.shade.score;
import java.io.IOException;
import java.io.StringReader;
import java.util.Collections;
import java.util.Comparator;
import java.util.LinkedList;
import java.util.prefs.Preferences;
import com.shade.util.CsvReader;
/**
* Read high scores from a csv file located in the jar.
*
* This is useful if the remote server cannot be reached.
*
* @author Alexander Schearer <aschearer@gmail.com>
*/
public class LocalHighScoreReader implements HighScoreReader {
private static final String EMPTY_STRING = "";
private static final String SCORE_KEY = "scores";
private static final int NAME = 0;
private static final int SCORE = 1;
private static final int CLEAR = 2;
/**
* Returns all the scores if zero is passed.
*/
public String[][] getScores(int level, int limit) {
Preferences prefs = Preferences.userNodeForPackage(this.getClass());
StringReader s = new StringReader(prefs.get(SCORE_KEY + level, EMPTY_STRING));
CsvReader reader = new CsvReader(s);
LinkedList<String[]> rows = new LinkedList<String[]>();
try {
while (reader.readRecord()) {
String[] row = new String[3];
row[NAME] = reader.get(NAME);
row[SCORE] = reader.get(SCORE);
row[CLEAR] = reader.get(CLEAR);
rows.add(row);
}
} catch (IOException e) {
e.printStackTrace();
}
Collections.sort(rows, new Comparator<String[]>() {
public int compare(String[] s1, String[] s2) {
return s1[SCORE].compareTo(s2[SCORE]);
}
});
return firstN(rows, limit);
}
private String[][] firstN(LinkedList<String[]> rows, int limit) {
limit = (limit == 0) ? rows.size() : limit;
int size = (rows.size() > limit) ? limit : rows.size();
String[][] n = new String[size][3];
for (int i = 0; i < size; i++) {
n[i][NAME] = rows.get(i)[NAME];
n[i][SCORE] = rows.get(i)[SCORE];
n[i][CLEAR] = rows.get(i)[CLEAR];
}
return n;
}
}